昨天研究了一下handler的原始碼,今天總結一下:
android只有乙個執行緒可以操作ui介面,我們稱之為ui執行緒。
每個ui執行緒都維護乙個looper,這個looper中有乙個messagequeue來儲存ui乙個訊息佇列。通過控制這個訊息佇列來實現對ui介面的順序重新整理。
handler.sendmessage();
public final boolean sendmessage(message msg)
public final boolean sendmessagedelayed(message msg, long delaymillis)
return sendmessageattime(msg, systemclock.uptimemillis() + delaymillis);
}public boolean sendmessageattime(message msg, long uptimemillis)
else
return sent;
}
從以上**我們可以得出乙個結論,handler的所有sendmessage都是通過sendmessageattime來時實現的。關鍵的一行是queue.enqueuemessage這個方法。這裡的queue是個messagequeue.
final boolean enqueuemessage(message msg, long when)
if (msg.target == null && !mquitallowed)
synchronized (this) else if (msg.target == null)
msg.when = when;
"messagequeue", "enqueing: " + msg);
message p = mmessages;
if (p == null || when == 0 || when < p.when) else
msg.next = prev.next;
prev.next = msg;
this.notify();}}
return true;
}
以上**可以看出,messagequeue本質上是乙個鍊錶,這個鍊錶根據時間排序。這個鍊錶其實就是乙個訊息佇列。
剩下的就很簡單了,取訊息時只需要從這個訊息佇列中依次取得即可。
刪除訊息時,只需要根據what從這個鍊錶中摘除對應的訊息即可。
Handler原始碼分析
當程式執行時,會先執行activitythread的main方法。會執行looper.preparemainlooper 方法和looper.loop 方法。looper.preparemainlooper public static void preparemainlooper smainloop...
Handler通訊 原始碼分析
1.messagequeue 訊息佇列 執行緒中更新 ui 的時候經常是呼叫 sendmessage 和 sendmessagedelayed 這樣 我跟蹤 進入到 handler 的 sendmessage 方法 public final boolean sendmessage message m...
Handler原始碼解析
意思就是說 在沒有呼叫looper.prepare 之前不能在子執行緒建立handler。為什麼在主線程中我們就已經可以直接建立handler?因為在activity的啟動 中,已經在當前ui執行緒 主線程 呼叫了looper.preparemainlooper 和looper.loop 方法。我們...