HandlerThread原理解析

148 阅读1分钟

HandlerThread简介

HandlerThread继承自Thread类,用于启动一个具有looper的线程,start方法必须调用。其内部创建了Hanlder和looper,方便调用者使用。

HandlerThread源码分析

public class HandlerThread extends Thread {
    int mPriority;
    int mTid = -1;
    Looper mLooper;
    private @Nullable Handler mHandler;

内部有两个成员变量,Looper 和 Handler 重点看下其run方法

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

run方法中开启一个looper循环,因此当不需要使用,最好通过quit或者quitSafely来终止线程的执行。两者的区别在于quitSafely会执行完所有消息队列中的消息再退出,而quit则直接退出。

Handler的赋值,注释说明返回一个与此线程相关联的一个共享的Handler

    /**
     * @return a shared {@link Handler} associated with this thread
     * @hide
     */
    public Handler getThreadHandler() {
        if (mHandler == null) {
            mHandler = new Handler(getLooper());
        }
        return mHandler;
    }

HandlerThread的应用

IntentService中使用的例子

 HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();
         mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);

可以看到线程开启后,获取线程的looper,同时创建一个新的Handler,绑定这个Looper,以便通过此Handlerlooper中发送消息。