代码分析:HandlerThread详解

作者: iwuyou | 来源:发表于2017-03-12 12:29 被阅读39次

    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详解

        本文链接:https://www.haomeiwen.com/subject/tautnttx.html