在 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...