代码分析:HandlerThread详解

HandlerThread是一套安全的使用Handler机制的线程,在Thread中创建Handler并且使用Handler和线程通信也是一种任务调度场景,而在Thread中创建Handler需要考虑到线程安全以及同步的问题。
1.线程start之后,并不会立刻进入run方法中,也就是说在线程中使用Looper.prepare()然后再start线程,并不能够立刻就创建Looper对象,此时直接去获取Looper是null。
2.线程的同步问题,Looper对象在创建的时候需要做好同步,否则在多个线程创建的时候会导致Looper重复创建,进而使app崩溃。
HandlerThread很好的处理好了这2个问题,首先对于第一个问题,在线程start之后,我们使用getLooper()获取Looper的时候,当Looper对象还没创建,就会使线程进入等待状态,直到Looper对象创建完成并且返回。

public Looper getLooper() {
        if (!isAlive()) {
            return null;
        }
        
        // If the thread has been started, wait until the looper has been created.
        synchronized (this) {
            while (isAlive() && mLooper == null) {
                try {
                    wait();
                } catch (InterruptedException e) {
                }
            }
        }
        return mLooper;
    }

在run方法中HandlerThread在创建Looper对象的时候也做好了同步。

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

同时开放出onLooperPrepared()方法给子类继承扩展,类似于Activity中的onCreate方法。
另外Handler还提供了退出HandlerThread的方法。

public boolean quitSafely() {
        Looper looper = getLooper();
        if (looper != null) {
            looper.quitSafely();
            return true;
        }
        return false;
    }

    /**
     * Returns the identifier of this thread. See Process.myTid().
     */
    public int getThreadId() {
        return mTid;
    }

你可能感兴趣的:(代码分析:HandlerThread详解)