而EventBus的官解翻译过来大概就是: EventBus能够简化各组件的通信,让我们的代码变得简单,能有效的分离事件发送方和接收方(也就是解耦),能避免复杂和容易出错的依赖性和生命周期问题
EventBus的概述:
EventBus是一种用于Android的发布/订阅事件总线。它有很多优点:简化应用组件间的通信;解耦事件的发送者和接收者;避免复杂和容易出错的依赖和生命周期的问题;很快,专门为高性能优化过等等。
发布者通过EventBus发布事件,订阅者通过EventBus订阅事件。当发布者发布事件时,订阅该事件的订阅者的事件处理方法将被调用。
三要素:
- Event事件。它可以是任意类型
- Subscriber事件订阅者。在EventBus3.0之前我们必须定义以onEvent开头的那几个方法,分别是onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,而在3.0之后事件处理的方法名可以随意取,不过需要加上注解@subscribe(),并且 指定线程模型,默认是POSTING
- Publisher事件的发布者。我们可以在任意线程里发布事件,一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可
四种 线程模型
- POSTING(默认)表示事件处理函数的线程跟发布事件的线程在同一个线程
- MAIN表示事件处理函数的线程在主线程(UI线程),因此在这里不能进行耗时操作
- BACKGROUND表示事件处理函数的线程在后台线程,因此在这里不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么实际那处理函数将会开启一个后台线程,如果发布事件的线程实在后台线程,那么事件处理函数就是用该线程
- ASYNC表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作
使用步骤:
//导入依赖
implementation 'org.greenrobot:eventbus:3.1.1'
//普通实体类
public class People {
private String name;
public People() {
super();
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public People(String name) {
this.name = name;
}
}
//在onCreate()方法内部注册订阅者
//注册订阅者
EventBus.getDefault().register(this);
//此方法用于响应EventBus的事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(People event) {
//可以在此方法内更新界面
}
//在页面销毁时注销订阅者
@Override
protected void onDestroy() {
super.onDestroy();
//注销订阅者
EventBus.getDefault().unregister(this);
}