Android中Handler

山有木xi發表於2020-04-29

在效能最佳化方面考慮,Android的UI操作其實並不是執行緒安全的,這意味著如果有多個執行緒併發操作UI元件,就會導致執行緒安全的問題,為了這個問題,Android提供瞭解決方法:指定了一條簡單的規則,只允許UI執行緒修改Activity裡的元件

當第一個程式第一次啟動時,Android會同時啟動一條Main Thread(主執行緒),負責處理和UI相關的時間,比如按鍵時間,接觸螢幕以及螢幕繪製事件,並把相關的時間分發到對應的元件進行處理。因此,主執行緒又被稱為UI執行緒

Android的訊息傳遞機制是裡外一種形式的“事件處理”,這是為了解決Android應用的多執行緒問題:只允許UI執行緒修改Activity裡的U元件,這樣會導致新啟動的執行緒無法動態改變介面元件的屬性值。但是在實際的開發中,尤其是涉及動畫的遊戲開發中,需要讓新啟動的執行緒週期性的改變介面元件的屬性,這就需要Handler的訊息傳遞機制來實現

  • Handler的底層實現原理

要理解handler的實現原理,其實最重要的是Looper的實現原理,Looper才是實現handler機制的核心。

任何一個handler在使用sendMessage或者post時候,都是先構造一個Message,並把自己放到Message中,然後把Message放到對應的Looper的MessageQueue,Looper透過控制MessageQueue來獲取message執行其中的handler或者runnable。

要在當前執行緒中執行handler指定操作,必須要先看當前執行緒中有沒有looper,如果有looper,handler就會透過sendMessage,或者post先構造一個message,然後把message放到當前執行緒的looper中,looper會在當前執行緒中迴圈取出message執行,如果沒有looper,就要透過looper.prepare()方法在當前執行緒中構建一個looper,然後主動執行looper.loop()來實現迴圈。

  • Handler類的兩個作用:在新啟動的執行緒中傳送資訊和在主執行緒中獲取、處理資訊

  • Message:Handler處理和接收的訊息物件

  • Looper:每個執行緒擁有一個Looper,它的loop負責讀取MessageQueue中的訊息,讀到訊息之後,就把訊息交給該訊息的Handler處理

  • MessageQueue:訊息佇列,採用先進先出的方式來管理Message。程式建立Loop時就會在它的構造器中建立MessageQueue物件

  • 在主UI執行緒中,系統已經初始化; 一個Loop物件,因此可以直接建立Handler

  • 在自己啟動的子執行緒中,必須自己建立一個Looper物件,啟動它,建立物件並呼叫它的prepare方法


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69917874/viewspace-2689232/,如需轉載,請註明出處,否則將追究法律責任。

相關文章