HandlerThread详解
阅读原文时间:2021年04月20日阅读:2
  1. 作用 :获取子线程的looper,使用该looper初始化handler时可以获取子线程的handler对象

  2. 用法

    1. HandlerThread mHanderThread = new HandlerThread("threadName");
    2. mHanderThread.start();//获取位于新线程的Looper对象
    3. Handler mHander = new Hander(mHandlerThread.getLooper());//至此创建了一个子线程处理任务的Handler对象,可以在此mHandler中处理耗时任务
  3. HandlerThread方法里面最后退出释放资源有两个方法,分别是quit()和quitSafely(),下面看一下这两个方法的区别:由HandlerThread源码可知这两个方法最终分别调用了MessageQueue里面的以下两个方法

    private void removeAllMessagesLocked() {
        Message p = mMessages;
        while (p != null) {
            Message n = p.next;
            p.recycleUnchecked();
            p = n;
        }
        mMessages = null;
    }
    
    private void removeAllFutureMessagesLocked() {
        final long now = SystemClock.uptimeMillis();
        Message p = mMessages;
        if (p != null) {
            if (p.when > now) {
                removeAllMessagesLocked();
            } else {
                Message n;
                for (;;) {
                    n = p.next;
                    if (n == null) {
                        return;
                    }
                    if (n.when > now) {
                        break;
                    }
                    p = n;
                }
                p.next = null;
                do {
                    p = n;
                    n = p.next;
                    p.recycleUnchecked();
                } while (n != null);
            }
        }
    }

    最终到了MessageQueue的removeAllMessageLocked()和removeAllFutureMessageLocked(),由上面的代码可知,前一个方法删除了所有messageQueue里面的message,后面一个判断了时间,只删除了执行时间大于当前时间的message,也就是说会把delay为0以及当前需要执行的message执行完。

  4. 总结:
           HandlerTheard继承自 Thread类,并创建位于该线程的Looper对象,提供了getLooper()方法来获取创建的looper对象,以及quit()和quitSafely()两个方法退出并释放messageQueue队列 ,注意run()方法里面的notifyAll和getLooper方法里面的wait。解决了多线程操作的线程同步问题,因为getLooper是在一个线程调用而run方法是在另一个线程调用,getLooper方法执行时如果run方法没有执行则进入wait等待,直到run方法中looper初始化完毕唤醒该方法。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章