前言
handler、messagequeue、looper三者間的關係如圖:
從上圖可以看出,handler傳送執行緒訊息到當前執行緒的messagequeue中,而looper用來管理messagequeue,它從messagequeue中取到訊息交給handler處理。
looper
在activity中的ui主線程中,無需使用顯式的方式進行looper的初始化以及開始迴圈,是因為activity內部包含乙個looper物件,它會自動管理looper,處理子執行緒中傳送過來的訊息。而初始化handler的時候,在handler的建構函式中,會把當前執行緒的looper與handler關聯,所以在activity中,無需顯式使用looper。下面通過乙個例子講解一下activity中,工作執行緒給主線程傳送訊息的例子。
實現**:
1實現效果:package
com.example.handlerlooperdemo;23
import
4import
android.os.bundle;
5import
android.os.handler;
6import
android.os.looper;
7import
android.os.message;
8import
android.view.view;
9import
android.widget.button;
10import
android.widget.textview;
1112
public
class mainthreadactivity extends
activity
35});
36 btnsendtoui2.setonclicklistener(new
view.onclicklistener()
48});49}
5051
public
class myhandler extends
handler
5556
public
myhandler(looper looper)
5960
@override
61public
void
handlemessage(message msg) 65}
66 }
通過上面的demo可以看到,雖然handler有兩個建構函式,乙個需要傳遞乙個looper物件,乙個不需要,但是對於ui執行緒而言,使用哪個其實效果是一樣的,因為activity會幫我們維護looper物件。
而對於子執行緒而言,沒有任何物件幫助我們維護looper物件,所以需要我們自己手動維護。這時候就需要使用prepare()和loop()方法了。下面通過乙個demo來演示一下在ui執行緒中給子執行緒傳送訊息的實現。注意,因為這個handler是在子執行緒中宣告的,所以在handler中處理訊息的實現,也必須符合子執行緒的限制,一些無法在子執行緒中做的事情,也無法這裡實現,比如訪問網路、操作ui元件。
實現**:
1效果展示:package
com.example.handlerlooperdemo;23
import
4import
android.os.bundle;
5import
android.os.handler;
6import
android.os.looper;
7import
android.os.message;
8import
android.util.log;
9import
android.view.view;
10import
android.widget.button;
11import
android.widget.toast;
1213
public
class workthreadactivity extends
activity
35};
36//
把剛才初始化的looper物件執行起來,迴圈訊息佇列的訊息
37looper.loop();38}
39}).start();
4041 btnsendtoworkui=(button)findviewbyid(r.id.btnsendtoworkui);
4243 btnsendtoworkui.setonclicklistener(new
view.onclicklistener()
53});54}
5556
57 }
總結
本篇部落格講解了handler在傳送訊息的原理,並且也說明了如何在ui執行緒和子執行緒中互相通訊的方式,雖然在實際開發過程中,很少會用到ui執行緒向子執行緒傳送訊息的實現,但是通過這個例子也更好的說明了looper的原理。
from:
Android 多執行緒之Handler
前言 android的訊息傳遞機制是另外一種形式的 事件處理 這種機制主要是為了解決android應用中多執行緒的問題 在android中不允許activity新啟動的執行緒訪問該activity裡的ui元件,handler handler,它直接繼承自object,乙個handler允許傳送和處理...
Android多執行緒之IntentService
1.intentservice繼承自service public abstract class intentservice extends service override public void handlemessage message msg public intentservice stri...
Android 多執行緒之Looper
前言 handler messagequeue looper三者間的關係如圖 從上圖可以看出,handler傳送執行緒訊息到當前執行緒的messagequeue中,而looper用來管理messagequeue,它從messagequeue中取到訊息交給handler處理。looper 在activ...