EventBus 是一款在 Android 开发中使用的发布/订阅事件总线框架,基于观察者模式,将事件的接收者和发送者分离,避免复杂且容易出错的依赖关系和生命周期问题,简化了组件之间的通信。
EventBus的优点
- 通过ThreadMode方便灵活的指定工作线程
- 速度快
- 功能多,使用方便
- 对事件通信双方进行解耦
- 简化的组件间交流的方式
使用
- 在使用之前先将EventBus作为依赖项添加进项目中
步骤一:定义事件
创建一个事件类型,消息类型可以是基本数据类型,也可以是自定义的一个事件类
public class MessageEvent {
public String message;
public MessageEvent(String message) {
this.message = message;
}
}
@Override
public String toString() {
return "MessageEvent{" +
"message='" + message + '\'' +
'}';
}
步骤二:准备订阅者
订阅者实现事件处理方法,在事件发布时即将被调用,通过@Subscribe注释定义。
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event){
Toast.makeText(this,event.toString(),Toast.LENGTH_LONG).show();
Log.i("test","onMessageEvent" + event.toString());
}
用户需要自己注册和注销从总线,只有在注册订户时,他们才能收到事件,通过根据活动和片段的生命周期进行注册,大多数情况下,onStart/onStop可以正常工作
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
protected void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
步骤三:发布活动
MessageEvent event = new MessageEvent("Hello");
EventBus.getDefault().post(event);
传递线程(ThreadMode)
threadMode 用来决定onMessageEvent在那种线程环境下呗调用
- POSTING :这是EventBus的默认模式,表示post事件是什么线程,onMessageEvent接收事件方法就在同样的线程环境中执行代码
- MAIN:,无论事件发布在什么线程,事件接收都是在主线程中执行。如果发布者post事件在主线程中的话,会阻塞post事件所在的线程。
- MAIN_ORDERED:订阅者将在Android的主线程中调用。该事件始终排入队列,以便以后交付给订阅者,因此投递呼叫将立即返回。这使事件处理具有更严格和更一致的顺序(因此名称为MAIN_ORDERED)
- BACKGROUND:订户将在后台线程中被调用。如果发布线程不是主线程,则将在发布线程中直接调用事件处理程序方法。如果发布线程是主线程,则EventBus使用单个后台线程,该线程将顺序传递其所有事件。
- ASYNC:事件处理程序方法在单独的线程中调用。
Sticky
sticky是一个boolean型的参数,默认值是false,表示不启用sticky特性。EventBus事件传递的例子的时候,我们都是先对订阅者(Subscriber)进行先注册的,然后再post事件的。那sticky的作用是在先post事件,后对订阅者注册这种开发场景的支持的。
priority
该参数是int型,默认值是0,优先级。在同一传递线程(ThreadMode)中,优先级较高的订户将在其他优先级较低的订户之前接收事件。
取消事件传送
以通过从订户的事件处理方法中调用cancelEventDelivery (对象事件) 来取消事件传递过程 。任何进一步的事件传递将被取消,后续的订阅者将不会接收该事件。
EventBus.getDefault().cancelEventDelivery(event) ;
事件通常由优先级较高的订户取消。