Android 多執行緒之Looper

2021-09-02 18:13:21 字數 2467 閱讀 9698

前言

handler、messagequeue、looper三者間的關係如圖:

從上圖可以看出,handler傳送執行緒訊息到當前執行緒的messagequeue中,而looper用來管理messagequeue,它從messagequeue中取到訊息交給handler處理。

looper

在activity中的ui主線程中,無需使用顯式的方式進行looper的初始化以及開始迴圈,是因為activity內部包含乙個looper物件,它會自動管理looper,處理子執行緒中傳送過來的訊息。而初始化handler的時候,在handler的建構函式中,會把當前執行緒的looper與handler關聯,所以在activity中,無需顯式使用looper。下面通過乙個例子講解一下activity中,工作執行緒給主線程傳送訊息的例子。

實現**:

package com.example.handlerlooperdemo;

import android.os.bundle;

import android.os.handler;

import android.os.looper;

import android.os.message;

import android.view.view;

import android.widget.button;

import android.widget.textview;

public class mainthreadactivity extends activity

});btnsendtoui2.setonclicklistener(new view.onclicklistener()

});}

public class myhandler extends handler

public myhandler(looper looper)

@override

public void handlemessage(message msg) }}

實現效果:

通過上面的demo可以看到,雖然handler有兩個建構函式,乙個需要傳遞乙個looper物件,乙個不需要,但是對於ui執行緒而言,使用哪個其實效果是一樣的,因為activity會幫我們維護looper物件。

而對於子執行緒而言,沒有任何物件幫助我們維護looper物件,所以需要我們自己手動維護。這時候就需要使用prepare()和loop()方法了。下面通過乙個demo來演示一下在ui執行緒中給子執行緒傳送訊息的實現。注意,因為這個handler是在子執行緒中宣告的,所以在handler中處理訊息的實現,也必須符合子執行緒的限制,一些無法在子執行緒中做的事情,也無法這裡實現,比如訪問網路、操作ui元件。

實現**:

package com.example.handlerlooperdemo;

import android.os.bundle;

import android.os.handler;

import android.os.looper;

import android.os.message;

import android.util.log;

import android.view.view;

import android.widget.button;

import android.widget.toast;

public class workthreadactivity extends activity

};

// 把剛才初始化的looper物件執行起來,迴圈訊息佇列的訊息

looper.loop();

}}).start();

btnsendtoworkui=(button)findviewbyid(r.id.btnsendtoworkui);

btnsendtoworkui.setonclicklistener(new view.onclicklistener()

});}

}

效果展示:

總結

本篇部落格講解了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...