EventBus :針對(duì)Android優(yōu)化的發(fā)布/訂閱事件總線,簡(jiǎn)化應(yīng)用程序內(nèi)各組件間挑势、組件與后臺(tái)線程間的通信。
優(yōu)點(diǎn):開(kāi)銷小纽门,代碼又簡(jiǎn)潔優(yōu)雅薛耻,將發(fā)送者和接受者解耦。
eventbus三要素
1.event:事件赏陵,可以是任意類型的對(duì)象
2.Subscriber:事件訂閱者饼齿,eventbus3.0之前消息處理的方法只限定于onEvent()/onEventMainThread()/onEventBackgroundThread()和onEventAsync()四種線程模型。3.0之后事件處理的方法可以隨便取名蝙搔,但是需要添加注解@Subsceribe,和指定線程模型(默認(rèn)posting)
3.publisher:事件發(fā)布者缕溉,可以在任意線程任意位置發(fā)送事件,直接調(diào)用eventbus的post(object)方法吃型≈づ福可自己實(shí)例化eventbus對(duì)象,一般使用eventbus。getDefault()就可枉层,根據(jù)post函數(shù)參數(shù)的類型泉褐,會(huì)自動(dòng)調(diào)用訂閱相應(yīng)類型事件的函數(shù)
eventbus的四種線程模型
1.posting(默認(rèn)):若使用事件處理函數(shù)指定了線程模型,那么該事件在哪個(gè)線程發(fā)布出來(lái)的鸟蜡,時(shí)間梳理函數(shù)就會(huì)在那個(gè)線程中運(yùn)行膜赃。也就是說(shuō)發(fā)布事件和接收事件在同一個(gè)線程,在該線程的事件處理函數(shù)中盡量避免執(zhí)行耗時(shí)操作揉忘,因?yàn)樗鼤?huì)阻塞時(shí)間的傳遞跳座,甚至可能引起ANR
2.MAIN:事件的處理會(huì)在UI線程中執(zhí)行,事件處理的時(shí)間不能太長(zhǎng)泣矛,否則會(huì)ANR
3.BACKGROUND:事件的處理會(huì)在UI線程中發(fā)布出來(lái)疲眷,那么該事件處理函數(shù)就會(huì)在新的線程中運(yùn)行,如果事件本來(lái)就是子線程發(fā)布出來(lái)的您朽,那么該事件處理函數(shù)直接在發(fā)布事件的線程中執(zhí)行狂丝。此事件處理函數(shù)中禁止進(jìn)行UI更新操作
4.async:無(wú)論事件在哪個(gè)線程發(fā)布,該事件處理函數(shù)都會(huì)在新建的子線程中執(zhí)行虚倒,同樣的美侦,此事件處理函數(shù)禁止進(jìn)行UI更新操作
使用流程
1.自定義一個(gè)事件類
public class UserData {
private String name;
private String message;
//getter setter
}
2.在需要訂閱事件的地方注冊(cè)事件
EventBus.getDefault().register(this);
3.發(fā)送事件
UserData data = new UserData();
data.setName("老子王");
data.setMessage("今天中了一等獎(jiǎng)");
EventBus.getDefault().post(data);
4.處理事件
/**
*sticky 如果為true,則發(fā)送最近的粘性事件
*priority 訂閱者優(yōu)先級(jí)魂奥,影響事件傳遞的順序菠剩,越大優(yōu)先級(jí)越高
**/
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true, priority = 1)
public void eventBus(UserBean userBean){
//todo 發(fā)送事件傳遞來(lái)的消息,想干啥干啥
}
5.取消事件訂閱
EventBus.getDefault().unregister(this);
粘性事件
使用postSticky()發(fā)送事件耻煤,那么可以不需要先注冊(cè)具壮,也能接受到事件,也就是一個(gè)延遲注冊(cè)的過(guò)程哈蝇。