EventBus是用於Android和Java的發佈/訂閱事件總線
原理:發佈者發佈事件,訂閱者通過EventBus接收事件,做出相應的響應。
EventBus的優點有:
1.簡化組件間的通信
2.使代碼更加簡潔
3.具有高級特性,如交付線程、訂閱者優先級等
4.框架體積小
EventBus的具體使用:
1.定義事件實體類
例如:
public class NightMessageEvent {
private boolean isNight;
public NightMessageEvent(boolean isNight) {
this.isNight = isNight;
}
public boolean isNight() {
return isNight;
}
public void setNight(boolean night) {
isNight = night;
}
}
類名和類的具體業務由自己決定,我這裏使用了一個Boolean值用於判斷狀態。
2.向EventBus註冊,成爲訂閱者以及解除註冊,並聲明訂閱方法
在需要接收的Activity或者Fragment中註冊和解除註冊:
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
同上,在需要接收的地方做事件的接收:
@Subscribe(threadMode = ThreadMode.POSTING)//我這裏由於是同一個線程,所以用POSTING
public void onNightEvent(NightMessageEvent nightMessageEvent){
//這裏是接收到事件後,自己的操作
boolean night = nightMessageEvent.isNight();
initNavigationTabBar(night);
}
3.發送事件:
EventBus.getDefault().post(new NightMessageEvent(true));
在需要發送事件的地方發送即可。
總體用起來真的很簡單方便。
這裏還有一點需要注意:在第二步中用到了一個ThreadMode,它是一個枚舉類型,有着以下幾個類型:
POSTING:表示訂閱方法運行在發送事件的線程。
MAIN:表示訂閱方法運行在UI線程,由於UI線程不能阻塞,因此當使用MAIN的時候,訂閱方法不應該耗時過長。
BACKGROUND:表示訂閱方法運行在後臺線程,如果發送的事件線程不是UI線程,那麼就使用該線程;如果發送事件的線程是UI線程,那麼新建一個後臺線程來調用訂閱方法。
ASYNC:訂閱方法與發送事件始終不在同一個線程,即訂閱方法始終會使用新的線程來運行。
ThreadMode默認是使用POSTING的,如果需要更改設置,可以在添加註解的時候同時爲threadMode賦值。
至於priority 優先級 sticky 粘性事件等用到的時候再說吧
最後提一下,忘了一點,需要先在build.gradle中引入:
compile ‘org.greenrobot:eventbus:3.1.1’