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’