Android 多執行緒之Looper

2021-08-21 07:36:59 字數 2816 閱讀 6264

前言

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的原理。

Android 多執行緒之Handler

前言 android的訊息傳遞機制是另外一種形式的 事件處理 這種機制主要是為了解決android應用中多執行緒的問題 在android中不允許activity新啟動的執行緒訪問該activity裡的ui元件,handler handler,它直接繼承自object,乙個handler允許傳送和處理...

Android 多執行緒之Looper

前言 handler messagequeue looper三者間的關係如圖 從上圖可以看出,handler傳送執行緒訊息到當前執行緒的messagequeue中,而looper用來管理messagequeue,它從messagequeue中取到訊息交給handler處理。looper 在activ...

Android多執行緒之IntentService

1.intentservice繼承自service public abstract class intentservice extends service override public void handlemessage message msg public intentservice stri...