EventBus
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
工作:订阅者订阅事件到总线,发送者发布事件。
订阅者可以订阅多个事件,
发送者可以发布任何事件,
发布者同时也可以是订阅者。
EventBus.getDefault().register(this);//订阅事件
EventBus.getDefault().post(object);//发布事件
EventBus.getDefault().unregister(this);//取消订阅
methodName 这个是写死的:“onEvent”,用于确定扫描什么开头的方法,可见我们的类中都是以这个开头。
priority 优先级,优先级越高,在调用的时候会越先调用。
@Subscribe(priority = 1)
public void onEvent(MessageEvent event) {
…
}
{0,1,2}和线程优先级一样
- PostThread 默认实现,执行发生在同一个线程
- MainThread 执行在UI 线程上
- BackgroundThread 回调发生在非 UI 线程上
- Async 永远执行在一个其他的线程上
黏性事件sticky
除了上面讲的普通事件外,EventBus还支持发送黏性事件。何为黏性事件呢?简单讲,就是在发送事件之后再订阅该事件也能收到该事件,跟黏性广播类似。
订阅黏性事件:
EventBus.getDefault().register(StickyModeActivity.this);
黏性事件处理函数:
@Subscribe(sticky = true)
public void XXX(MessageEvent messageEvent) {
......
}
坑:
1、若使用EventBus时出现异常:Subscriber class *** and its super classes have no public methods with the @Subscribe annotation
报错的原因:使用EventBus的方法不是public,且缺少@Subscribe这个注解。
按照提示改为public,并且加上@Subscribe这个注解就Ok了
2、若收不到事件,比如在Activity的oncreat中发送事件,在Fragment中的oncreat中接收事件,可能是因为发送事件时Fragment还未注册EventBus。
3、发送事件的类是不需要注册的,只有接收事件的类需要注册;注意要记得在合适时机取消注册。
4.消息的接收是根据参数中的哦object类名来决定执行哪一个的(每种事件都必须自定义一个事件类,造成事件类太多)
在3.0之前,EventBus还没有使用注解方式。消息处理的方法也只能限定于onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,分别代表四种线程模型。而在3.0之后,消息处理的方法可以随便取名,但是需要添加一个注解@Subscribe,并且要指定线程模型(默认为PostThread)