hander messagequeue loop

MessageQueue
消息隊列 存放hander 發佈的消息 .消息隊列 通常附屬於某一個創建他的線程
Looper.myQueue 獲取當前線程的消息隊列. 如果沒有queue就報異常.
android 啓動時候 默認爲UI Thread 創建一個關聯的消息隊列.用來管理 程序的一些上層組件
activities broadcast receivers 等等.你可以在自己的子線程創建hander 於UI thread 進行通訊.也就是說我們程序一啓動我們的UI 線程也就是主線程 就會有一個消息隊列.如果我們開啓另外一個子線程 就不會有有messagequeue消息隊列

Hander
通過hander 你可以發佈或者處理 一個消息或者一個runable 實例.每個hander 都會與 唯一的一個線程 以及改線程的消息隊列 關聯.當你創建一個hander 的時候 默認情況下 它將關聯到創建它的這個線程 和該線程的消息隊列.也就是說 你通過hander 發佈消息的時候 消息將會發送到與它關聯的這個消息隊列.當然也之能處理改消息隊列的消息.
也就是說 一個hander 對應一個線程以及附屬於該線程的消息隊列.
比如 我們現在有一個hander 對象 這個hander 在UI 線程創建 叫xh_hander .
xh_hander 和娜個線程關聯?
用這個hander 發送消息的話 它將發送給那個線程的消息隊列?
這時 我們用這個hander 對象發送消息 他有發送消息的方法.

hander 主要方法
public final boolean sendMessage(Message msg)

消息放入hander 關聯的消息隊列.消息隊列尾部
消息放進去的一段 消息不會阻塞.處理消息的一段就可能會有阻塞.

public void handerMessage(Message msg)
關聯到該消息隊列的線程通過調用hander 的handermessage 放入接受和處理消息.通常需要子類化hander 實現handerMessage

Looper
Looper 扮演一個Hander 和消息隊列之間通訊橋樑的較色.程序組件 首先通過Hander把消息傳遞給Looper Looper 把消息放進隊列.Looper也把消息隊列裏的消息 傳遞給所有Hander。Hander 接受到消息後調用handeMessage 進行處理.

可以通過Looper.myLoopger 獲取當前線程的looper 實例.如果當前線程未關聯一個looper實例 返回空 不會拋空指針異常.
可以通過靜態方法 Loopger.getMainLooper 方法獲取主線程的Looper 實例。主線程默認是有一個Looper 對象.但是我們的子線程是沒有的.我們子線程如何獲取Looper 對象.
如果一個線程中調用Looper.prepare 那系統就會自動爲該線程建立一個消息隊列.然後調用Looper.loop 之後進入了消息循環. 之後可以發消息 去消息 處理消息.這個如何發送消息 和如何處理消息 可以在其他線程中 通過hander 來做.但前提是我們的hander 知道這個子線程的looper.如果你不是在子線程運行 Looper.myLoopger 一般是得不到子線程的Looper.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章