EventBus是什么?
EventBus是一个类似于Broadcast,可以在不同组件和不同线程之间进行通信传递数据的一个组件。
为什么要使用EventBus而不是使用Broadcast?
EventBus相比较Broadcast线程开销要小的多,并且操作简便快捷。
EventBus具体使用场景
1. Activity、Fragment之间的数据传递。
我们在使用Activity时,如果需要对数据进行传递,可以使用Intent或者使用sharepreference持久化,但是如果在Fragment中传递数据我们一般更多的是使用接口回调来处理。此处其实我们使用EventBus效果会更好。
2. 跨越多个Activity传递信息。
假设有一个场景,有A、B、C三个Activity,当我从A到B到C之后,需要关闭A,此时我们可以通过EventBus向A发送一个消息,A接受到消息之后,便执行finish()操作。
EventBus使用步骤
由于EventBus的注册和注销是成对出现的,所以步骤如下
添加依赖
compile 'org.greenrobot:eventbus:3.0.0'
第一步: 在onCreate()中进行数据的注册
EventBus.getDefault.register(this)
第二步: 在onDestroy()中对数据进行注销操作
EventBus.getDefault.unregister(this)
第三步: 在注册的Activity中,写一个方法,此方法用@Subscribe进行修饰。然后在此方法中判断传递过来的信息是否符合你需要的要求,从而采取相应的处理。
@Subscribe
public void onMainEvent(Event event) {
finish();
}
这里需要注意一下,我们在EventBus3.0之后这个被subscribe修饰的方法才可以随便命名,而在使用EventBus2.0的时候,这个方法是不能够随便命名的。
第四步
编写一个Event的类,用这个类来统一发送消息
public class EventBus<T> {
private Integer code;
private String message;
private T data;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
第五步
在需要发送消息的方法中使用EventBus.getDefault.post(Object obect)发送消息。
由以上五步操作,我们便可以完成对Eventbus的操作使用。
关于Subscribe的那点事
我们知道在使用EventBus发送消息之后,我们会用一个自己写的方法配合上subscribe修饰之后来接收这个消息。但是接收到这个消息之后的操作如果是一个非常耗时的操作时我们怎么处理呐?一般我们想到的操作是开启一个线程来单独处理这个耗时操作。其实EventBus中关于subscribe有一个线程模型,可根据业务需要,选择接收消息处理在哪个线程中执行。
EventBus有四种线程模型( threadMode = ThreadMode.XX)
- POSTING(默认):这种线程模型的特点在于,事件在哪个线程发出,事件处理函数就会在哪个线程中运行处理。也就是,发出事件和接收事件始终出现用一个线程中。
- MAIN:这种线程模型顾名思义,事件不管在那些个线程发出,事件处理接收始终在主线程中进行操作。由此这里必须注意,这种模式下,我们不要在事件处理函数中进行耗时操作,避免ANR。
- BACKGROUND:如果事件在UI线程发出,则事件处理函数会在新的子线程中运行,如果事件在子线程中发出,那么该事件处理函数就会直接在子线程中接收。 在此事件中,禁止做更新UI操作
- ASYNC:无论事件在哪个线程发布,事件处理函数都会在新建的子线程中执行。在此事件中,禁止做更新UI操作