android 實現主線程 子執行緒雙向通訊

2021-06-03 02:36:10 字數 2425 閱讀 5528

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

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

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

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

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

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

view plain

print?

handlerthread mhandlerthread = new handlerthread("sub_thread");  

mhandlerthread.start();  

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

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

view plain

print?

class myhandler extends handler   

public myhandler(looper looper)   

@override

public

void handlemessage(message msg)   

}  }  

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

完整**:

view plain

print?

package mark.zhang;  

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方法執行在子執行緒

* * @author mark

*/class myhandler extends handler   

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

public myhandler(looper looper)   

@override

public

void handlemessage(message msg)   

}  }  

}  

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

view plain

print?

// 獲取 looper 物件

myhandler mhandler = new myhandler(mhandlerthread.getlooper());  

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

view plain

print?

// 獲取 looper 物件

myhandler mhandler = 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?

myhandler mhandler = new myhandler(getmainlooper());  

myhandler mhandler = new myhandler();  

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

view plain

print?

myhandler mhandler = new myhandler(mhandlerthread.getlooper());  

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

主線程 子執行緒死掉 主線程可以在子執行緒之前死掉

我相信主線程不能在子執行緒之前死亡。但是有什麼方法可以檢查嗎?我在下面寫了乙個簡單的程式。任何人都可以證明它實際上離開理論嗎?class childre extends thread public void run for int i 0 i 10 i system.out.println chil...

主線程 子執行緒 通訊 最好用同步方式

從worker執行緒中顯示輸出 此刻我想先打個岔,請各位看看,如何讓 wo rker 執行緒把字串放到列表框 listbox 中。列表框的訊息迴圈總是被程式的主線程掌管,雖然這並非絕對必要,但是讓主線程負責所有的螢幕更新工作,是相當理想的。我在程式中定義了乙個訊息,名為 wm plea se upd...

WPF 多執行緒 子執行緒操作介面主線程的元素

1 在 中開啟乙個子執行緒 thread cabservice new thread new threadstart datareceiver cabservice.start 每隔2s 產生乙個資料 public void datareceiver thread.sleep 2000 2 定義 和...