Handler訊息機制的原理及應用場景
在Android系統中出於效能優化考慮,Android的UI操作並不是執行緒安全的,這意味著如果有多個執行緒併發操作UI元件,可能導致執行緒安全問題。為了解決這個問題,Android制定了一條簡單的原則,只允許UI執行緒(亦即主執行緒)修改Activity中的UI元件。但實際上,有部分UI需要在子執行緒中控制其修改邏輯,因此子執行緒需要通過handler通知主執行緒修改UI,實現執行緒間通訊。(在遊戲開發中尤其常見,例如需要讓新啟動的執行緒週期性的改變UI,或者實現檔案下載等。)
Handler機制主要包括四個關鍵物件,分別是:Message、Handler、MessageQueue、Looper。下面對這四個關鍵物件進行簡要的介紹。
1)Message
Message是線上程之間傳遞的訊息,它可以在內部攜帶少量的資訊,用於在不同執行緒之間交換資料。Message的what欄位可以用來攜帶一些整型資料,obj欄位可以用來攜帶一個Object物件。
2)Handler
Handler顧名思義就是處理者的意思,它主要用於傳送訊息和處理訊息。一般使用Handelr物件的sendMessage()方法傳送訊息,發出的訊息經過一系列的輾轉處理後,最終會傳遞到Handler物件的handlerMessage()方法中。
3)MessageQueue
MessageQueue是訊息佇列的意思,它主要用來存放通過Handler傳送的訊息。通過
4)Looper
Looper是每個執行緒中的MessageQueue的管家。呼叫Looper的loop()方法後,就會迴圈檢查MessageQueue中是否有訊息,如果MessageQueue中存在一條訊息,就會將它取出,並傳遞到Handler的handlerMessage()方法中。此外每個執行緒也只會有一個Looper物件。在主執行緒中建立Handler物件時,系統已經為我們建立了Looper物件,所以不用手動建立Looper物件,而在子執行緒中建立Handler物件時,我們需要呼叫