使用Handler子執行緒向主線程通訊方式及原始碼解析

2021-07-10 01:21:40 字數 1560 閱讀 2745

第一步:在主線程中,申明並定義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 今天寫這篇文章主要是...