一、removeCallbacksAndMessages应用场景
当在A类初始化了一个Handler,使用的是主线程的Looper,用于发送延迟消息和主线程切换,当A类释放资源的时候调用removeCallbacksAndMessages(null),意思是清空当前Handler队列所有消息。因为不这样做会导致A类释放后还有可能执行Handler的那个延迟消息。
二、源码解析
void removeCallbacksAndMessages(Handler h, Object object) {
if (h == null) {
return;
}
synchronized (this) {
Message p = mMessages;
// Remove all messages at front.
while (p != null && p.target == h && (object == null || p.obj == object)) {
Message n = p.next;
mMessages = n;
p.recycleUnchecked();
p = n;
}
// Remove all messages after front.
while (p != null) {
Message n = p.next;
if (n != null) {
if (n.target == h && (object == null || n.obj == object)) {
Message nn = n.next;
n.recycleUnchecked();
p.next = nn;
continue;
}
}
p = n;
}
}
}
在移除消息的时候会判断是否是当前的Handler,说明只会移除当前handler的消息不会移除looper所有的的消息,所以我们可以放心的使用。