您當前位置:
首頁 >
php開源 >
綜合技術 > 單線程模型中Message、Handler、MessageQueue、Looper之間的關系
單線程模型中Message、Handler、MessageQueue、Looper之間的關系
來源:程序員人生 發布時間:2014-12-19 08:23:41 閱讀次數:2528次
Handler簡介:
1個Handler允許你發送和處理Message和Runable對象,這些對象和1個線程的MessageQueue相干聯。每個線程實例和1個單獨的線程和該線程的MessageQueue相干聯。當你創建1個新的Handler時,它就和創建它的線程綁定在1起了。這里,線程我們也能夠理解為線程的MessageQueue。從這1點上來看,Handler把Message和Runable對象傳遞給MessageQueue,而且在這些對象離開MessageQueue時,Handler負責履行他們。
Handler有兩個主要的用處:
(1)肯定在將來的某個時間點履行1個或1些Message和Runnable對象。
(2)在其他線程(不是Handler綁定線程)中排入1些要履行的動作。
Scheduling Message,即(1),可以通過以下方法完成:
post(Runnable):Runnable在handler綁定的線程上履行,也就是說不創建新線程。
postAtTime(Runnable,long):
postDelayed(Runnable,long):
sendEmptyMessage(int):
sendMessage(Message):
sendMessageAtTime(Message,long):
sendMessageDelayed(Message,long):
post這個動作讓你把Runnable對象排入MessageQueue,MessageQueue遭到這些消息的時候履行他們,固然以1定的排序。sendMessage這個動作允許你把Message對象排成隊列,這些Message對象包括1些信息,Handler的hanlerMessage(Message)會處理這些Message.固然,handlerMessage(Message)必須由Handler的子類來重寫。這是編程人員需要作的事。
當posting或sending到1個Hanler時,你可以有3種行動:當MessageQueue準備好就處理,定義1個延遲時間,定義1個精確的時間去處理。后二者允許你實現timeout,tick,和基于時間的行動。
當你的利用創建1個新的進程時,主線程(也就是UI線程)自帶1個MessageQueue,這個MessageQueue管理頂層的利用對象(像activities,broadcast
receivers等)和主線程創建的窗體。你可以創建自己的線程,并通過1個Handler和主線程進行通訊。這和之前1樣,通過post和sendmessage來完成,差別在于在哪個線程中履行這么方法。在恰當的時候,給定的Runnable和Message將在Handler的MessageQueue中被Scheduled。
Message簡介:
Message類就是定義了1個信息,這個信息中包括1個描寫符和任意的數據對象,這個信息被用來傳遞給Handler.Message對象提供額外的兩個int域和1個Object域,這可讓你在大多數情況下不用作分配的動作。
雖然Message的構造函數是public的,但是獲得Message實例的最好方法是調用Message.obtain(),或Handler.obtainMessage()方法,這些方法會從回收對象池中獲得1個。
MessageQueue簡介:
這是1個包括message列表的底層類。Looper負責分發這些message。Messages其實不是直接加到1個MessageQueue中,而是通過MessageQueue.IdleHandler關聯到Looper。
你可以通過Looper.myQueue()從當前線程中獲得MessageQueue。
Looper簡介:
Looper類被用來履行1個線程中的message循環。默許情況,沒有1個消息循環關聯到線程。在線程中調用prepare()創建1個Looper,然后用loop()來處理messages,直到循環終止。
大多數和message loop的交互是通過Handler。
下面是1個典型的帶有Looper的線程實現。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public voidhandleMessage(Message msg) {
// process incomingmessages here
}
};
Looper.loop();
}
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
------分隔線----------------------------
------分隔線----------------------------