Android 多執行緒之Handler

2021-07-05 04:24:51 字數 1920 閱讀 6000

前言

android的訊息傳遞機制是另外一種形式的「事件處理」,這種機制主要是為了解決android應用中多執行緒的問題

,在android中不允許activity新啟動的執行緒訪問該activity裡的ui元件,

handler

handler, 它直接繼承自object,乙個handler允許傳送和處理message或者runnable物件,並且會關聯到主線程的messagequeue 中。每個handler具有乙個單獨的執行緒,並且關聯到乙個訊息佇列的執行緒,就是說乙個handler有乙個固有的訊息佇列。當例項化乙個handler 的時候,它就承載在乙個執行緒和訊息佇列的執行緒,這個handler可以把message或runnable壓入到訊息佇列,並且從訊息佇列中取出 message或runnable,進而操作它們。

handler主要有兩個作用:

上面介紹到handler可以把乙個message物件或者runnable物件壓入到訊息佇列中,進而在ui執行緒中獲取message或者執行runnable物件,所以handler把壓入訊息佇列有兩大體系,post和sendmessage:

從上面的各種方法可以看出,不管是post還是sendmessage都具有多種方法,它們可以設定runnable物件和message物件被入隊到訊息佇列中,是立即執行還是延遲執行。

post

對於handler的post方式來說,它會傳遞乙個runnable物件到訊息佇列中,在這個runnable物件中,重寫run()方法。一般在這個run()方法中寫入需要在ui執行緒上的操作。

在handler中,關於post方式的方法有:

下面通過乙個demo,講解如何通過handler的post方式在新啟動的執行緒中修改ui元件的屬性:

有一點值得注意的是,對於post方式而言,它其中runnable物件的run()方法的**,均執行在ui執行緒上,所以對於這段**而言, 不能執行在ui執行緒上的操作,一樣無法使用post方式執行,比如說訪問網路,下面提供乙個例子,使用post方式從網際網路上獲取一張,並且顯示在 imageview中。

message.obtain()方法具有多個過載方法,大致可以分為為兩類,一類是無需傳遞handler物件,對於這類的方法,當填充好消 息後,需要呼叫handler.sendmessage()方法來傳送訊息到訊息佇列中。第二類需要傳遞乙個handler物件,這類方法可以直接使用 message.sendtotarget()方法傳送訊息到訊息佇列中,這是因為在message物件中有乙個私有的handler型別的屬性 target,當時obtain方法傳遞進乙個handler物件的時候,會給target屬性賦值,當呼叫sendtotarget()方法的時候,實 際在它內部還是呼叫的target.sendmessage()方法。

在handler中,也定義了一些傳送空訊息的方法,如:sendemptymessage(int what)、sendemptymessagedelayed(int what,long delaymillis),看似這些方法沒有使用message就可以傳送乙個訊息,但是如果檢視原始碼就會發現,其實內部也是從 message.obtain()方法中獲取乙個message物件,然後給屬性賦值,最後使用sendmessage()傳送訊息到訊息佇列中。

handler中,與message傳送訊息相關的方法有:

下面通過乙個小demo演示一下各種傳送message的方式:

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

Android 多執行緒之Looper

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