Android訊息傳遞之Handler訊息機制

2021-07-30 03:59:24 字數 2397 閱讀 7722

無論是現在所做的專案還是以前的專案中,都會遇見執行緒之間通訊、元件之間通訊,目前統一採用eventbus來做處理,在總結學習eventbus之前,覺得還是需要學習總結一下最初的實現方式,也算是不忘初心吧,這也是今天來學習總結handler訊息機制的乙個原因。

handler機制產生背景

乙個android應用程式被建立的時候都會建立乙個ui主線程,但是有時我們會有一些比較耗時的操作,為了防止阻塞ui主線程,我們會將耗時的操作放到子執行緒中進行處理,處理完之後操作ui,但是android不允許子執行緒操作ui,違背了android單執行緒模型的原則(即 android ui操作並不是執行緒安全的並且這些操作必須在ui執行緒中執行),所以android通過handler訊息機制來實現執行緒之間的通訊。

handler機制主要角色

message:訊息,其中包含了訊息id,訊息處理物件以及處理的資料等,由messagequeue統一列隊,終由handler處理。 

handler:處理者,負責message的傳送及處理。使用handler時,需要實現handlemessage(message msg)方法來對特定的message進行處理,例如更新ui等。 

messagequeue:訊息佇列,用來存放handler傳送過來的訊息,並按照fifo規則執行。當然,存放message並非實際意義的儲存,而是將message以鍊錶的方式串聯起來的,等待looper的抽取。 

looper:訊息幫浦,不斷地從messagequeue中抽取message執行。因此,乙個messagequeue需要乙個looper。 

thread:執行緒,負責排程整個訊息迴圈,即訊息迴圈的執行場所。

handler機制主要運用

1.)傳送訊息,在不同的執行緒間傳送訊息,使用的方法為send***();

sendemptymessage(int);//

傳送乙個空的訊息

sendmessage(message);//

傳送訊息,訊息中可以攜帶引數

sendmessageattime(message, long);//

未來某一時間點傳送訊息

sendmessagedelayed(message, long);//

延時nms傳送訊息

舉例:主線程定義handler

handler mhandler = new

handler() }};

子執行緒發訊息,通知handler完成ui更新

private

void

getdatafromnet()

}).start();

}

2.)計畫任務,在未來執行某任務,使用的方法為post***();

post(runnable);//

提交計畫任務馬上執行

postattime(runnable, long);//

提交計畫任務在未來的時間點執行

postdelayed(runnable, long);//

提交計畫任務延時nms執行

示例:主線程定義handler

private handler mhandler=new handler();
子執行緒提交任務更新ui

private

void

getdatafromnet()

});}

}).start();

}

handler機制擴充套件

為了更加方便的使用handler訊息機制,android也提供了幾種擴充套件方式,內部實現都是基於handler訊息機制

1.)activity.runonuithread(runnable)

private

void

getdatafromnet()

});}

}).start();

}

2 .)view.post(runnable)

private

void

getdatafromnet()

});}

}).start();

}

5.)使用asynctask代替thread

private

void

getdatafromnet()

private

class mytask extends

asynctask

//後台執行緒執行結束後的操作,其中引數result為doinbackground返回的結果

@override

protected

void

onpostexecute(object result)

}

Android訊息傳遞之元件間傳遞訊息

前言 上篇學習總結了android通過handler訊息機制實現了工作執行緒與ui執行緒之間的通訊,今天來學習一下如何實現元件之間的通訊。本文依然是為學習eventbus做鋪墊,有對比才能進步,今天主要介紹在eventbus出現之前的實現方式,通過intent方式這裡不做介紹。需求場景 方式一 通過...

Android 訊息傳遞

在建立handler時,handler在其構造方法中 嘗試從當前執行緒 建立hanlder例項物件的執行緒 的threadlocal中取到looper物件 並將該looper物件賦值給當前hanlder物件,同時還會將looper物件的messagequeue引用賦值給當前handler。publi...

Android 訊息傳遞機制分析

android系統出於系統優化的原因,ui執行緒操作並不是執行緒安全的,這意味著如果多執行緒併發操作ui元件,則可能導致執行緒執行緒安全。所以為了解決這個問題,android制定了一條規則 只允許ui執行緒修改activity裡的ui元件。當乙個程式啟動第一次啟動時,android會同時啟動一條主線...