第一步:在主線程中,申明並定義handler物件。
private handler mhandler = new handler()
第二步:在子執行緒中,傳送訊息給主線程。
第三步:在子執行緒裡面:
1. looper.prepare(), 呼叫流程looper.prepare()->
looper.prepare(true)->
threadlocal.set(new looper()),
在new looper()物件裡面:
(1)建立佇列
(2)獲取當前執行緒
2. looper.loop()
(1)獲取子執行緒裡面的當前佇列
(2)從佇列裡面取出頭部訊息, message msg = messagequeue.next()
(3)分發訊息,通過msg.target.dispatch(msg), 其中msg.target = mhandler
子執行緒執行handler時,要呼叫looper.prepare();同時沒有 looper.loop();則handlemessage 接受不到訊息。 //所有的操作必須在 looper.loop()之前,因為 looper.loop()為死迴圈。
looper執行原理,原始碼解析:
looper.loop()方法內的原始碼:final looper me = mylooper(); // 獲取當前looper
final messagequeue queue = me.mqueue;取出訊息佇列
取出訊息佇列之後進行死迴圈
message msg = queue.next(); 在佇列取訊息,沒有訊息就堵塞程序,不執行下面**
msg.target.dispatchmessage(msg);將訊息分發下去
msg.target.dispatchmessage(msg); msg.target.相當於帶唯一標示的handler類的。
此時相當於呼叫handler類中的
/**
* handle system messages here.
*/ public void dispatchmessage(message msg) else
} handlemessage(msg);
} }
方法。通過handlemessage(msg);呼叫handler類中的
/**
* subclasses must implement this to receive messages.
*/ public void handlemessage(message msg)
方法,此方法就是:
handler handler = new handler()
} };中的 public void handlemessage(message msg)
Handler 主線程如何通知子執行緒
在 android 中,不可以在子執行緒中更新 ui 的操作,否則會報錯或者異常資訊。在這種情況下,我們會使用 handler 在 ui 執行緒建立該物件 接收子執行緒的訊息更新 ui.可見,此時的 handlemessage 是在主線程中執行的。每個主線程預設有乙個 looper,也就是說在主線程...
Handler 主線程如何通知子執行緒
在 android 中,不可以在子執行緒中更新 ui 的操作,否則會報錯或者異常資訊。在這種情況下,我們會使用 handler 在 ui 執行緒建立該物件 接收子執行緒的訊息更新 ui.可以看出,這是子執行緒通知主線程,而主線程沒有直接通知子執行緒,那麼我們如何做到這一點?這樣有什麼好處?好處,很明...
子執行緒中使用Handler
在子執行緒中使用handlerlooper.prepare mhandler new handler mhandler.sendemptymessage 1 looper.loop 在子執行緒中更新uihandler main new handler getmainlooper 今天寫這篇文章主要是...