Android基本功:Handler訊息傳送機制

yangxi_001發表於2016-03-04

轉自:http://blog.csdn.net/thanklife/article/details/16983877


一、什麼是UI執行緒 

  • 當程式第一次啟動的時候,Android會同時啟動一條主執行緒( Main Thread)。 

  • 主要負責處理與UI相關的事件。 

 

二、UI執行緒存在的問題 

  • 出於效能優化考慮,Android的UI操作並不是執行緒安全的,意味著如果多個執行緒併發操作UI執行緒,可能導致執行緒安全問題。 

  • 為了解決這個問題,Android規定:只允許UI執行緒修改Activity裡的UI組建。 

 

三、訊息傳送機制作用 

  • 為了解決Android應用多執行緒問題—Android平臺只允許UI執行緒修改Activity裡的UI組建,就會導致新啟動的執行緒無法改變介面組建的屬性值。 

 

四、Handler的作用(子執行緒往主執行緒傳送訊息的情況) 

  • 在新啟動的執行緒中傳送訊息。 

    • 使用Handler物件的sendMessage()方法或者SendEmptyMessage()方法傳送訊息。 

  • 在主執行緒中獲取處理訊息。 

    • 重寫Handler類中處理訊息的方法(void handleMessage(Message msg)),當新啟動的執行緒傳送訊息時,訊息傳送到與之關聯的MessageQueue。而Hanlder不斷地從MessageQueue中獲取並處理訊息。 

     

五、Hanlder類 

Handler類包含如下方法用於傳送、處理訊息: 

  • void handleMessage(Message msg):處理訊息的方法,該方法通常用於被重寫。 

  • final boolean hasMessage(int what):檢查訊息佇列是否包含what屬性指定值的訊息。 

  • final boolean hasMessage(int what,Object object):檢查訊息佇列中是否包含what屬性為指定且object屬性為指定指定物件的訊息。 

  • Message obtainMessage():獲取訊息。 

  • sendEmptyMessage(int what):傳送空訊息。 

  • final boolean sendEmptyMessageDelayed(int what,long delayMillis):指定多少毫秒之後傳送空訊息。 

  • final boolean sendMessage(Message msg):立即傳送訊息。 

  • final boolean sendMessageDelayed(Message msg,long delayMillis):指定多少毫秒之後傳送訊息。 

 

六、Handler、Loop、MessageQueue、Message原理 

  • Handler: 

    • 傳送訊息,它能把訊息傳送給Looper管理的MessageQueue。 

    • 處理訊息,並負責處理Looper分給它的訊息。 

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

  • Looper: 

    • 每個執行緒只有一個Looper,它負責管理MessageQueue,會不斷地從MessageQueue取出訊息,並將訊息分給對應的Hanlder處理。 

      • 主執行緒中,系統已經初始化了一個Looper物件,因此可以直接建立Handler即可,就可以通過Handler來傳送訊息、處理訊息。 

      • 程式自己啟動的子執行緒,程式必須自己建立一個Looper物件,並啟動它,呼叫Looper.prepare()方法。 

    • prapare()方法:保證每個執行緒最多隻有一個Looper物件。 

    • looper()方法:啟動Looper,使用一個死迴圈不斷取出MessageQueue中的訊息,並將取出的訊息分給對應的Handler進行處理。 

  • MessageQueue:由Looper負責管理,它採用先進先出的方式來管理Message。 

 

七、使用Handler步驟 

  1. 呼叫Looper的prepare()方法為當前執行緒建立Looper物件,建立Looper物件時,它的構造器會建立與之配套的MessageQueue。 

  2. 有了Looper之後,建立Handler子類例項,重寫HanderMessage()方法,該方法負責處理來自於其他執行緒的訊息。 

  3. 呼叫Looper的looper()方法啟動Looper。

相關文章