简介
Github地址
EventBus是一个在Android上使用的发布/订阅事件总线,能够简化组件间的通信,解耦事件的发送和接收。
使用场景
在我们平常项目开发的时候,经常会用Intent在界面之间相互通信,或者使用Handler在线程间进行通信,或者广播通知。当项目越来越大时,各模块之间代码耦合度越来越高,相互通信很容易搞混。而EventBus极大的简化了组件间的通信,并且很好的解决了代码耦合度的问题。
EventBus三要素
1、event:自定义事件,可以是任意类型。
2、Publisher:事件发布者,可以在任意线程发布事件,EventBus为我们提供了EventBus.getDefault()获取EventBus对象,并通过post(event)的方式发布事件。
3、Subscriber:事件订阅者,通过EventBus给我们提供的注解@Subscribe(threadMode)为处理事件的函数指定线程。
线程模型
由ThreadMode这个类我们可以看出,EventBus为我们提供五种线程模型,分别是:
1、POSTING:默认模式,指定事件处理函数在发布事件所处线程中执行。
2、MAIN:指定事件处理函数在主线程(UI线程)中执行。
3、MAIN_ORDERED:指定事件处理函数在主线程(UI线程)中执行,事件会首先进入队列然后才会发给订阅者,严格保证了事件执行的顺序性。
4、BACKGROUND:有两种情况
1、如果发布事件的线程是在主线程,则重新开启一个线程执行事件处理函数;
2、如果发布事件的线程是在后台线程,则事件处理函数会在当前线程中执行;
5、ASYNC:无论发布事件的是哪一个,都会重新开启一个线程执行事件处理函数,一般用于网络访问、数据库读写等需要执行时间的操作。
基本使用
EventBus的使用非常简单,主要有三个步骤:
1、自定义事件
2、订阅事件并且定义事件处理函数
3、发布事件
添加依赖
在项目的build.gradle中添加依赖
implementation 'org.greenrobot:eventbus:3.1.1'
自定义事件类型
这个类就是用来定义事件传输所需要的数据,没有任何特殊要求,可以根据实际需求定义。
public class MessageEvent{
private String message;
public MessageEvent(String message){
this.message=message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
注册事件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 注册事件
EventBus.getDefault().register(this);
}
// 定义事件处理函数
@Subscribe(threadMode = ThreadMode.MAIN)
public void test(MessageEvent event) {
Log.e("gybguohao","收到的事件消息 = " + event.getMessage());
}
其中事件处理的函数名可以随便定义,只需要通过EventBus提供的@Subscribe注解,并且指定线程模型就行了。
事件处理函数的参数是你需要订阅的事件类型,这个例子中也就是上面创建的MessageEvent。
注意:事件处理函数必须是public权限,有且仅有一个参数。
发布事件
MessageEvent me = new MessageEvent("通过EventBus发布的事件");
EventBus.getDefault().post(me);
在项目中需要的地方发布事件,只要注册并且订阅了该事件类型的地方都会收到该事件。
解除注册
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
最后,别忘了在适当的时候解除注册,释放内存,这与平时我们使用的广播很相似。