handler原始碼分析

2021-09-12 05:57:19 字數 1245 閱讀 2212

昨天研究了一下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 方法。我們...