消息驅動機制
Android擴展了線程的退出機制,在啓動線程時,可以首先在線程內部創建一個消息隊列,然後讓線程進入一個無限循環中,在這個無限循環中,線程會不斷檢查消息隊列中是否有消息。如果需要線程執行某個任務,便向線程的消息隊列中發送對應任務的消息,線程在無限循環中檢查到消息隊列中有消息到來,便會獲取該消息,進而執行該消息對應的處理流程。如果線程的消息隊列中沒有消息,線程便進入等待狀態,等待消息的到來。通過消息控制線程的執行。
涉及的概念:
1.消息:用於表示一個可執行任務。通常在消息內部會封裝消息的標識、執行時間、數據等。
2.消息隊列:消息創建完畢後,通過消息處理器將其發送到線程的消息隊列中,消息隊列維護當前可執行消息的列表。
3.消息循環:當前線程進入消息循環中遍歷消息隊列獲取消息,然後根據消息標識通知消息處理器及執行對應的函數。
4.消息處理器。
Looper線程
爲了實現消息驅動機制,Android基於Java標準線程模型開發了Looper線程。
Looper線程與標準線程的區別:
1.Looper線程的run方法執行後並不會立即退出,而是進入一個loop消息循環中等待消息的到來,然後根據消息類型分別作出不同的處理,好處是避免了頻繁創建/銷燬線程所帶來的開銷。
class LooperThread extends Thread{
public Handler mHandler;
public void run(){
Looper.prepare();
mHandler = new Handler(){
public void handleMessage(Message msg){
}
}
}
Looper.loop();
}
Handler:handler是Lopper線程的消息處理器,創建並初始化Handler是Looper線程運行過程中的關鍵步驟之一。Hnadler承擔了消息驅動機制的發送消息和處理消息兩部分工作。
在Handler對象的創建中,其所作的工作是將之前在本線程中創建的Looper和MessageQueue關聯到其成員變量中,這樣,Lopper、MessageQueue和Handler就連接到一起了。其中Handler的成員變量mMessenger用於跨進程發送消息。//TODO(Handler的代碼)
通過Handler post和send方法發送的消息,最終會存入MessageQueue內部的消息隊列mMessage中,mMessage是Message類型的對象,其內部的next成員變量引用了下一條Message。Message在消息隊列中是按照執行時間(when)排列的,因此消息入列前有兩大類的處理情況:1.立即處理的;2.新加入消息的處理時間要晚於消息隊列頭部消息的處理時間,需要遍歷消息隊列,找到新消息的插入位置。
Message:消息的載體。