【消息通信】Android消息驅動機制

消息驅動機制

  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:消息的載體。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章