android: HandlerThread 源码浅析

该博客介绍了一个系统内部常用对象,其源码简单实用,简化了子线程使用。使用场景类似后台任务,无结果回调。它是某子类,核心方法可将对应对象取出调用。线程开启时回调特定方法,本质是开启线程创建对应对象,并给出使用示例。

HandlerThread该对象其实系统内部使用的比较多,比如IntentService。而调用者一般不会去直接使用。
不过HandlerThread源码非常简单。实现也谈不上有太多技巧性。不过还是蛮实用的。简化了子线程Handler的使用。一般的场景下也用不上。

Handler的使用场景是,需要在某个时候,让子线程去完成某个逻辑。类似于后台任务。而且,不会有结果回调处理,需要把结果回调出来的话,需要再创建一个主线程Handler去做这件事。

首先,HandlerThreadThread的子类。然后,里面最重要的方法,就是run()方法了。

    @Override
    public void run() {
        mTid = Process.myTid();
        Looper.prepare();
        synchronized (this) {
            mLooper = Looper.myLooper();
            notifyAll();
        }
        Process.setThreadPriority(mPriority);
        onLooperPrepared();
        Looper.loop();
        mTid = -1;
    }

代码非常短。首先,创建并获取了当前线程的Looper对象。然后调用了Looper.loop()方法了。我们知道loop()方法的作用就是将对应的MessageQueue中的Message对象一个一个取出来,然后调用Handler#dispatchMessage(msg)方法。

另外,在线程开启的时候,也就是用户调用了HandlerThread#start()的时候,回调了一个方法onLooperPrepared();该方法在loop()之前,且只会调用一次。

通过这个run()方法,我们就知道HandlerThread的原理了。本质上,就是开启了一个线程,然后在线程中创建对应的Looper对象。

使用示例:

	private HandlerThread background;
    private Handler backHandler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_self);

        findViewById(R.id.button_click)
                .setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Log.v(TAG, "click this button...");
                        backHandler.sendEmptyMessage(27);
                    }
                });
        background = new HandlerThread("background-1") {
            @Override
            protected void onLooperPrepared() {
                super.onLooperPrepared();
                // 子线程,且只会调用一次
                Log.i(TAG, "onLooperPrepared..."+Thread.currentThread().getName());
            }
        };
        background.start();
        backHandler = new Handler(background.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
            	// 子线程
                Log.d(TAG, Thread.currentThread().getName() + "handlerMessage==" + msg.what);
            }
        };
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        background.quit(); // quit() 方法最好调用。这是让释放资源的。比如内部持有的`Message`对象。
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值