HandlerThread详解

来源:互联网 发布:怎么看淘宝店家链接 编辑:程序博客网 时间:2024/05/17 20:28
  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初始化完毕唤醒该方法。
1 0
原创粉丝点击