Android Handler笔记
Handler持有Looper和MessageQueue的引用.
Looper创建消息队列, 在队列中循环取消息. 持有MessageQueue和Thread的引用.
MessageQueue维持一个消息队列, 能进行消息的入队出队操作.
Message持有Handler的引用target, 和Runnable的引用callback.
在Handler的post(Runnable r)方法中, 给Message的callback赋值为r. 在enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis)中, 将msg.target赋值为this.
在Looper的loop()方法中, 开启死循环获取MessageQueue中的消息, 调用msg.target.dispatchMessage(msg), 交给Handler处理.
Handler的 dispatchMessage
方法:
/**
* Handle system messages here.
*/
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
只有Message.callback为空时, 才会交给Handler的handleMessage方法处理消息. 使用handle.post发送的消息callback一定不为空, 所以使用post一定不会触发handler的handleMessage方法.
Handler.post 和 Handler.sendMessage 本质上是一样的, 都是调用Handler.sendMessageDelayed. 区别在于post发送的消息callback不为空.