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不爲空.