1. 程式人生 > >Handler訊息機制的原理及應用場景

Handler訊息機制的原理及應用場景

Android系統中出於效能優化考慮,AndroidUI操作並不是執行緒安全的,這意味著如果有多個執行緒併發操作UI元件,可能導致執行緒安全問題。為了解決這個問題,Android制定了一條簡單的原則,只允許UI執行緒(亦即主執行緒)修改Activity中的UI元件。但實際上,有部分UI需要在子執行緒中控制其修改邏輯,因此子執行緒需要通過handler通知主執行緒修改UI,實現執行緒間通訊。(在遊戲開發中尤其常見,例如需要讓新啟動的執行緒週期性的改變UI,或者實現檔案下載等。)

Handler機制主要包括四個關鍵物件,分別是:MessageHandlerMessageQueueLooper。下面對這四個關鍵物件進行簡要的介紹。

1Message

Message是線上程之間傳遞的訊息,它可以在內部攜帶少量的資訊,用於在不同執行緒之間交換資料。Messagewhat欄位可以用來攜帶一些整型資料,obj欄位可以用來攜帶一個Object物件。

2Handler

Handler顧名思義就是處理者的意思,它主要用於傳送訊息和處理訊息。一般使用Handelr物件的sendMessage()方法傳送訊息,發出的訊息經過一系列的輾轉處理後,最終會傳遞到Handler物件的handlerMessage()方法中。

3MessageQueue

MessageQueue是訊息佇列的意思,它主要用來存放通過Handler傳送的訊息。通過

Handler傳送的訊息會存在MessageQueue中等待處理。每個執行緒中只會有一個MessageQueue物件。

4Looper

Looper是每個執行緒中的MessageQueue的管家。呼叫Looperloop()方法後,就會迴圈檢查MessageQueue中是否有訊息,如果MessageQueue中存在一條訊息,就會將它取出,並傳遞到HandlerhandlerMessage()方法中。此外每個執行緒也只會有一個Looper物件。在主執行緒中建立Handler物件時,系統已經為我們建立了Looper物件,所以不用手動建立Looper物件,而在子執行緒中建立Handler物件時,我們需要呼叫

Looper.prepare()方法建立一個訊息迴圈,最後呼叫 Looper.loop()使訊息迴圈起作用,從訊息佇列中取訊息,處理訊息。