一.简介
EventBus 是一个事件总线框架,可用于应用程序内各组件、组件与后台线程间的通信,比如两个Activity 或Fragment 之间的通信,都可以用EventBus 完成,另外Android 提供的LocalBroadcastManger 也可以实现,但是相对而言使用要更复杂,同时性能表现上也比EventBus略差。
EventBus 的优点也比较明显,API非常的简洁,使用简单,框架体积小,性能好,同时降低了组件之间的耦合度
EventBus 中三种角色:
-
Event:可以是我们自己定义的任意类型的对象
-
Publisher:事件发布者,可以在任意位置发送事件,使用EventBus的post方法发送,根据post方法的参数类型,会自动调用订阅相应类型的事件处理方法。
-
Subscriber:事件订阅者,订阅者内部需要声明事件处理方法,方法需要添加@Subscribe注解,注解中可以标注方法的运行的线程模型,下面介绍。
二.使用
EventBus的基本使用有下面一些步骤。
1.自定义事件
public class BEvent {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2.准备订阅者
// 注意事件处理方法要写成public
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(BEvent event) {
//do something
}
同时在组件中需要注册订阅者:
以Activity为例
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
也可以在onCreate,onDestroy中注册,解除。
这里介绍一下四种线程模型:
-
ThreadMode.POSTING:默认调用方式,在调用post方法的线程中执行,避免了线程切换,性能开销最小,注意不要执行耗时操作,可能会阻塞时间传递甚至会导致ANR。
-
ThreadMode.MAIN:在主线程中执行,同样注意不要执行耗时操作。
-
ThreadMode.BACKGROUND:如果调用post方法的线程不是主线程,则直接在该线程中执行,如果是在主线程则切换到后台单例线程,多个方法公用同个后台线程,按顺序执行,所以也要避免过于耗时的操作。
-
ThreadMode.ASYNC:开辟新的独立线程,可用来处理耗时操作,EventBus内部使用线程池,但要尽量避免大量长时间的异步线程,默认使用
Executor.newCachedThreadPool()
,可通过EventBusBuilder修改。
3.发送事件
BEvent event = new BEvent();
event.setMessage("test");
EventBus.getDefault().post(event);
4.粘性事件
除了普通事件外,EventBus还支持发送粘性事件,也就是发送事件之后,再订阅事件,订阅者也能收到该事件,与粘性广播类似。粘性事件在内存中保存最新消息,新消息到来会取消原有消息,只有在注册之后才会执行新消息,不注册的话,消息会一直在内存中。
发送粘性事件:
EventBus.getDefault().postSticky(event);
订阅者处理事件:
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
publicvoidonEvent(BEvent event) {
// do something
}
不要忘记 注册。
三. 其他
1.EventBusBuilder
EventBus提供了许多配置,一般情况下不需要配置,但有的时候可能有一些特殊要求,比如在开发的时候发生错误崩溃,而在发布的时候错误不崩溃等。
如果要修改默认实现的配置,必须在第一次EventBus.getDefault()之前配置,而且只能设置一次。所以建议在application的onCreate()中调用
EventBuseventBus = EventBus.builder().build(); //产生EventBus实例的另一种方式。
EventBus.builder()
.throwSubscriberException(BuildConfig.DEBUG)
.installDefaultEventBus();
2.priority事件的优先级
值越大,优先级越高。
@Subscribe(priority = 233)
public void onEvent(BEvent event) {
//do something
}
3.终止事件的传递
终止事件传递,后续事件不再调用,注意,只能在传递事件的时候调用
@Subscribe
public void onEvent(BEvent event) {
…
EventBus.getDefault().cancelEventDelivery(event);
}
网友评论