簡介
Github地址
EventBus是一個在Android上使用的發(fā)布/訂閱事件總線瘦棋,能夠簡化組件間的通信被廓,解耦事件的發(fā)送和接收党觅。
使用場景
在我們平常項目開發(fā)的時候,經(jīng)常會用Intent在界面之間相互通信倚喂,或者使用Handler在線程間進行通信每篷,或者廣播通知。當(dāng)項目越來越大時端圈,各模塊之間代碼耦合度越來越高焦读,相互通信很容易搞混。而EventBus極大的簡化了組件間的通信舱权,并且很好的解決了代碼耦合度的問題矗晃。
EventBus三要素
1、event:自定義事件宴倍,可以是任意類型张症。
2仓技、Publisher:事件發(fā)布者,可以在任意線程發(fā)布事件俗他,EventBus為我們提供了EventBus.getDefault()獲取EventBus對象脖捻,并通過post(event)的方式發(fā)布事件。
3兆衅、Subscriber:事件訂閱者地沮,通過EventBus給我們提供的注解@Subscribe(threadMode)為處理事件的函數(shù)指定線程。
線程模型
由ThreadMode這個類我們可以看出羡亩,EventBus為我們提供五種線程模型摩疑,分別是:
1、POSTING:默認模式夕春,指定事件處理函數(shù)在發(fā)布事件所處線程中執(zhí)行未荒。
2、MAIN:指定事件處理函數(shù)在主線程(UI線程)中執(zhí)行及志。
3、MAIN_ORDERED:指定事件處理函數(shù)在主線程(UI線程)中執(zhí)行寨腔,事件會首先進入隊列然后才會發(fā)給訂閱者速侈,嚴(yán)格保證了事件執(zhí)行的順序性。
4迫卢、BACKGROUND:有兩種情況
?1倚搬、如果發(fā)布事件的線程是在主線程,則重新開啟一個線程執(zhí)行事件處理函數(shù)乾蛤;
?2每界、如果發(fā)布事件的線程是在后臺線程,則事件處理函數(shù)會在當(dāng)前線程中執(zhí)行家卖;
5眨层、ASYNC:無論發(fā)布事件的是哪一個,都會重新開啟一個線程執(zhí)行事件處理函數(shù)上荡,一般用于網(wǎng)絡(luò)訪問趴樱、數(shù)據(jù)庫讀寫等需要執(zhí)行時間的操作。
基本使用
EventBus的使用非常簡單酪捡,主要有三個步驟:
?1叁征、自定義事件
?2、訂閱事件并且定義事件處理函數(shù)
?3逛薇、發(fā)布事件
添加依賴
在項目的build.gradle中添加依賴
implementation 'org.greenrobot:eventbus:3.1.1'
自定義事件類型
這個類就是用來定義事件傳輸所需要的數(shù)據(jù)捺疼,沒有任何特殊要求,可以根據(jù)實際需求定義永罚。
public class MessageEvent{
private String message;
public MessageEvent(String message){
this.message=message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
注冊事件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main)啤呼;
// 注冊事件
EventBus.getDefault().register(this)卧秘;
}
// 定義事件處理函數(shù)
@Subscribe(threadMode = ThreadMode.MAIN)
public void test(MessageEvent event) {
Log.e("gybguohao","收到的事件消息 = " + event.getMessage());
}
其中事件處理的函數(shù)名可以隨便定義,只需要通過EventBus提供的@Subscribe注解媳友,并且指定線程模型就行了斯议。
事件處理函數(shù)的參數(shù)是你需要訂閱的事件類型,這個例子中也就是上面創(chuàng)建的MessageEvent醇锚。
注意:事件處理函數(shù)必須是public權(quán)限哼御,有且僅有一個參數(shù)。
發(fā)布事件
MessageEvent me = new MessageEvent("通過EventBus發(fā)布的事件");
EventBus.getDefault().post(me);
在項目中需要的地方發(fā)布事件焊唬,只要注冊并且訂閱了該事件類型的地方都會收到該事件恋昼。
解除注冊
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
最后,別忘了在適當(dāng)?shù)臅r候解除注冊赶促,釋放內(nèi)存液肌,這與平時我們使用的廣播很相似。