在 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 定義 和...