Handler 主線程如何通知子執行緒

2021-08-26 13:54:37 字數 2534 閱讀 3875

在 android 中,不可以在子執行緒中更新 ui 的操作,否則會報錯或者異常資訊。

在這種情況下,我們會使用 handler(在 ui 執行緒建立該物件) 接收子執行緒的訊息更新 ui.

可以看出,這是子執行緒通知主線程,而主線程沒有直接通知子執行緒,那麼我們如何做到這一點?這樣有什麼好處?

好處,很明顯。主線程中如果有些耗時的操作,我們可以讓子執行緒去做,這時,主線程就可以通知子執行緒了!

實現這種操作的方式有很多,今天主要想說說 handlerthread 與 handler 的配合使用方法。

在主線程中,可以建立 handlerthread 物件:

view plain

print?

handlerthreadmhandlerthread=

newhandlerthread(

"sub_thread");

mhandlerthread.start();

這樣,就開啟了乙個子執行緒,該執行緒的名字就是 sub_thread.

然後,我們實現乙個繼承自 handler 的 myhandler 類:

view plain

print?

class

myhandler

extends

handler

public

myhandler(looperlooper)

@override

public

void

handlemessage(messagemsg)}}

最後,使用 message 來傳遞訊息,myhandler 會根據情況處理 message.

完整**:

view plain

print?

package

mark.zhang;

import

import

android.os.bundle;

import

android.os.handler;

import

android.os.handlerthread;

import

android.os.looper;

import

android.os.message;

import

android.util.log;

public

class

handlerthreadactivity

extends

activity

/**

*該handler呼叫handlemessage方法執行在子執行緒 *

*@authormark */

class

myhandler

extends

handler

/*這個構造方法必須有*/

public

myhandler(looperlooper)

@override

public

void

handlemessage(messagemsg)}}

} 這裡,我們思考乙個問題,**:

view plain

print?

//獲取looper物件

myhandlermhandler=new

myhandler(mhandlerthread.getlooper());

獲取 looper 物件,使用的是 handlerthread 物件的 getlooper 物件。為什麼不直接這樣:

view plain

print?

//獲取looper物件

myhandlermhandler=new

myhandler(getmainlooper());

如果這樣做的話,列印資訊如下:

view plain

print?

d/mark(

21852

):ui----threadname:main,threadid:1

d/mark(21852

):handlemessage---threadname:main,threadid:1

d/mark(21852

):我接受任務:我這邊事情太多,麻煩你幫忙處理一下!

可見,此時的 handlemessage 是在主線程中執行的。每個主線程預設有乙個 looper,也就是說在主線程中,下面**是等效的:

view plain

print?

myhandlermhandler=

newmyhandler(getmainlooper());

myhandlermhandler=new

myhandler();

但是子執行緒需要手動獲取如:

view plain

print?

myhandlermhandler=

newmyhandler(mhandlerthread.getlooper());

實現主線程、子執行緒雙向通訊可以在各自的執行緒中分別是用 handler 來傳遞資訊和處理訊息。

Handler 主線程如何通知子執行緒

在 android 中,不可以在子執行緒中更新 ui 的操作,否則會報錯或者異常資訊。在這種情況下,我們會使用 handler 在 ui 執行緒建立該物件 接收子執行緒的訊息更新 ui.可見,此時的 handlemessage 是在主線程中執行的。每個主線程預設有乙個 looper,也就是說在主線程...

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

第一步 在主線程中,申明並定義handler物件。private handler mhandler new handler 第二步 在子執行緒中,傳送訊息給主線程。第三步 在子執行緒裡面 1.looper.prepare 呼叫流程looper.prepare looper.prepare true ...

C 子執行緒執行完後通知主線程的方法

怎麼讓子執行緒去做主執行緒的事兒呢,我們只需要把主線程的方法傳遞給子執行緒就行了,那麼傳遞方法就很簡單了委託傳值嘛 下面有乙個例子,子執行緒幹一件事情,做完了通知主線程 public class program private static void fun object obj 次 i threa...