作用 :获取子线程的looper,使用该looper初始化handler时可以获取子线程的handler对象
用法
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执行完。
总结:
HandlerTheard继承自 Thread类,并创建位于该线程的Looper对象,提供了getLooper()方法来获取创建的looper对象,以及quit()和quitSafely()两个方法退出并释放messageQueue队列 ,注意run()方法里面的notifyAll和getLooper方法里面的wait。解决了多线程操作的线程同步问题,因为getLooper是在一个线程调用而run方法是在另一个线程调用,getLooper方法执行时如果run方法没有执行则进入wait等待,直到run方法中looper初始化完毕唤醒该方法。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章