EventBus简述
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
EventBus的使用
- 首先,需要在当前项目的build.gradle下添加依赖代码:
implementation 'org.greenrobot:eventbus:3.1.1'
- 其次,可以定义一个消息类(可以传对象或者字符串,如需其他类型,可自行添加),eg:
public class EventMessage {
private String message;
private Object object;
public EventMessage(String message) {
this.message = message;
}
public EventMessage(Object object) {
this.object = object;
}
public String getMessage() {
return message;
}
public Object getObject() {
return object;
}
public static EventMessage getInstance(String message) {
return new EventMessage(message);
}
public static EventMessage getInstance(Object message) {
return new EventMessage(message);
}
}
- 接下来,需要在接受消息的页面注册:
EventBus.getDefault().register(this);
- 然后,需要发送消息:
EventMessage msg = new EventMessage(cityWeather);
EventBus.getDefault().post(msg);
- 接下来, 在接受消息的实现:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onReceiveMsg(EventMessage eventMessage) {
setView((CityWeather) eventMessage.getObject());
}
- 最后,需要解除注册
EventBus.getDefault().unregister(this);
注:Subscriber:事件订阅者,在EventBus 3.0之前我们必须定义以onEvent开头的那几个方法,分别是onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,而在3.0之后事件处理的方法名可以随意取,不过需要加上注解@Subscribe,并且指定线程模型,默认是POSTING。
其中,线程模式有四种:
- POSTING:默认,表示事件处理函数的线程跟发布事件的线程在同一个线程。
- MAIN:表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
- BACKGROUND:表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
- ASYNC:表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
黏性事件
所谓的黏性事件,就是指发送了该事件之后再订阅者依然能够接收到的事件。使用黏性事件的时候有两个地方需要做些修改。一个是订阅事件的地方,这里我们在先打开的Activity中注册监听黏性事件:
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
在发送消息的地方,发送黏性事件消息:
EventBus.getDefault().postSticky(MessageWrap.getInstance(msg));
按照上面的模式,我们先在第一个Activity中打开第二个Activity,然后在第二个Activity中发布黏性事件,并回到第一个Activity注册EventBus。
优先级
在Subscribe注解中总共有3个参数,上面我们用到了其中的两个,这里我们使用以下第三个参数,即priority。它用来指定订阅方法的优先级,是一个整数类型的值,默认是0,值越大表示优先级越大。在某个事件被发布出来的时候,优先级较高的订阅方法会首先接受到事件。
注意:
- 只有当两个订阅方法使用相同的ThreadMode参数的时候,它们的优先级才会与priority指定的值一致;
- 只有当某个订阅方法的ThreadMode参数为POSTING的时候,它才能停止该事件的继续分发。