在android系統中,可以依賴handler和message實現執行緒間的通訊,這種機制也被稱之為訊息機制
handler:用於傳送和處理message,在主線程中建立的handler預設是執行在主線程的,所以,使用handler可以控制各個控制項的顯示
message:訊息的載體
傳送訊息:使用handler物件的sendmessage(message msg)方法傳送訊息
接受訊息:不需要開發者考慮
處理訊息:自定義類繼承handler,並重寫public void handlemessage(message msg)方法,決定如何處理訊息
在訊息(message)中封裝資料:可以使用message的int arg1、int arg2、object obj屬性封裝資料
關於message物件
----------------------------------------
message類有公有的無引數的構造方法,開發者可以隨意建立message物件,但是,message物件大多是被處理後就沒有存在的意義了,所以反覆建立message物件會無謂的消耗記憶體
推薦使用message.obtain()方法獲取訊息的物件,message類自身使用了「message池」對訊息物件進行管理,從而可以控制產生的message物件的數量
如果使用的message.obtain()方法中,使用到了handler做為引數,則需要使用message物件的sendtotarget()傳送訊息,而不再使用handler的sendmessage()系列方法
message的what屬性用於標識訊息的型別(因為子執行緒可能向主線程傳送若干種不同的訊息),不應該用於封裝有具體數值含義的資料,通常,what屬性的值應該使用靜態常量表示,例如msg.what = message_update_clock;
通過handler物件的obtainmessage()系列方法也可以獲取message物件,其實現效果與message類的obtain()方法是等效的
關於handler.callback
----------------------------------------
使用handler.callback介面的實現類物件,做為handler構造方法的引數,也可以實現對訊息的處理【推薦】
handler.callback定義了public boolean handlemessage(message msg)方法,其中,返回值(boolean型別)表示「是否已經完全處理了訊息」,當返回值為false時,如果存在其它的訊息處理方法,則對應的**也會被執行,當返回值為true時,表示「已經完全處理了訊息」,則其它的處理訊息的**不會執行
關於處理訊息的方式
----------------------------------------
1) 使用message.obtain(handler h, runnable callback)中的runnable物件處理訊息
2) 使用handler.callback處理訊息
3) 重寫handler類的handlemessage()處理訊息
以上3種方式可以並存,優先順序為1 -> 2 -> 3
當存在第1種方式時,訊息將直接被處理,並且不會向後傳遞
當第2種方式存在時,其public boolean handlemessage(message msg)方法的返回值決定訊息是否向後傳遞
android 執行緒間的通訊
在android,執行緒分為有訊息迴圈的執行緒和沒有訊息迴圈的執行緒,有訊息迴圈的執行緒一般都會有乙個looper,這個是android 的新概念。我們的主線程 ui執行緒 就是乙個訊息迴圈的執行緒。針對這種訊息迴圈的機制,我們引入乙個新的機制handler,我們有訊息迴圈,就要往訊息迴圈裡面傳送相...
Android 執行緒中的通訊(一)練習
參考博文 dateformat formats and parses dates in a locale sensitive manner.formatting turns a date into a string,and parsing turns a string into a date.簡單就...
android執行緒間通訊
原文 1,通過handler機制.private void one new thread catch interruptedexception e message message new message message.what 123 message.obj 通過handler機制 handler...