標籤:
Android 中的訊息模型(Message,MessageQueue,handle,looper,)
Android 中的訊息通訊
1.Android 中線程的應用機制?
1)Android 中所有的耗時操作應在背景工作執行緒執行。
2)Android 中所有的UI操作應該在主線程(UI線程)執行。
FAQ?
1)主線程執行執行耗時操作好嗎? 不好,這樣會阻塞UI操作。
2)工作執行完耗時操作,假如有資料要傳遞給主線程,那如何??
2.Android 中多線程應用時的訊息模型?
使用Android中訊息模型的目的是盡量不要去阻塞
主線程,然後給使用者一種比較友好的體驗。
Android 中訊息模型關注對象:
1)Message :資料的載體
2)MessageQueue: 儲存多個訊息對象
3)Looper:迭代訊息佇列,取出訊息。
4)Handler:發送,處理訊息佇列中的訊息。
Android中訊息模型關注對象虛擬碼實現:
class Message{
Object obj;資料
int what; 資料要用於做什麼
.....
}
class MessageQueue{
Object[] message=new Object[5];
public void put(Message msg){}
public Message tabke(){}
}
class Looper{
private MessageQueue msgQ;
public void loop(){
while(true){....}
}
}
class Handler{
public void sendMessage(Message msg){}
public void handleMessage(Message msg){}
}
3.Android 中訊息模型應用案例?
1)背景工作執行緒發訊息給主線程?
2)主線程發訊息給主線程?
3)主線程發訊息給背景工作執行緒?
記住:
1)主線程在啟動時已經預設建立了Looper和訊息佇列對象
2)給誰發訊息就讓handler關聯誰的Looper.
3)handler的handleMessage方法運行在哪個線程由handler
關聯的looper而定。
4.Android 中訊息模型對象相關方法總結?
1)Message
資料的載體
(obj資料,
what資料要用於做什麼,
obtain()獲得一個訊息,....)
2)MessageQueue儲存多個訊息對象
3)Looper(prepare()建立一個looper,並綁定到當前線程,
myLooper()獲得當前線程Looper,
loop(),
getMainLooper()預設關聯當前線程looper,
quit())
4)Handler(sendMessage訊息發送給誰,取決於handler關聯的looper,
handleMessage可以執行訊息的處理操作,sendXXXXX)
1主線程給主線程發訊息
1、通過主線程給主線程發訊息
訊息的分類:系統訊息、使用者自訂訊息
主線程中發訊息要藉助主線程Handler對象。
|-->當我們發送自訂訊息時,Handler需要我們自己構建。
|-->一個線程可能關聯很多個handler對象
主線程發送的訊息會儲存在主線程的MQ中。
主線程中的訊息佇列的管理者是主線程的Looper。
|-->此Looper內建一個阻塞式無限迴圈。
|-->此迴圈的目的是遍曆和Looper相關聯的MQ對象
|-->此Looper負責從MQ中擷取訊息,並將訊息交給Handler。
FAQ:
1)主線程的Looper對象何時建立?系統啟動時
此Looper對象建立以後會綁定到當前線程中(藉助ThreadLocal)
2)主線程中的MQ何時建立?Looper對象建立時,MQ自動建立。
3)MQ自訂訊息何時建立?如何建立?
|-->需要時建立。
|-->建立方法?
Message msg=Message.obtain();
Message msg=handler.obtainMessage();
4)主線程中的Handler對象何時建立?
|-->需要時建立。
|-->建立方式?
匿名內部類:new Handler(){重寫HandleMessage方法}
構建handler子類
2 子線程給主線程發送訊息
方案:在子線程中擷取主線程的Handler對象
如何擷取:
在主線程構建Handler對象。
在子線程中構建主線程Handler對象??
handler=new Handler(Looper.getMainLooper());
3 子線程如何建立Looper對象
1、子線程中建立Looper的理由?
子線程中預設沒有Looper對象
子線程中需要使用子線程的handler對象發送訊息
2、子線程建立Looper的方式?建立Looper時自動構建MQ
Looper.prepare();//構建過程?先從當前線程取,若無則建立。建立後綁定到當前線程。
...構建handler
Looper.loop();
FAQ:
a. 子線程的handler構建時需要子線程的Looper
b. 子線程的Handler對象發送訊息是發送到子線程的MQ
c. 子線程在處理訊息時不能更新主線程介面。
4 主線程如何擷取子線程的Handler對象
方案:設法在主線程中擷取子線程的Looper對象。
Android 中的訊息模型(Message,MessageQueue,handle,looper)