本篇是基于 http://www.jianshu.com/p/acfe78296bb5 这篇文章。简单的总结下,加深记忆。(其实就是copy)
前言
EventBus是greenrobot在Android平台发布的一款以订阅——发布模式为核心的开源库。EventBus翻译过来是事件总线的意思,可以这样理解:一个个事件(event)发送到总线上,然后EventBus根据已注册的订阅者(subscribers)来匹配相应的事件,进而把事件传递给订阅者,这也是观察者模式的一个最佳实践。
那么EventBus可以用到什么地方呢?我们平时开发的时候,当遇到Activity与Activity、Activity与Fragment之间的通信,往往采用Intent,又或者线程之间使用Handler进行通信,这样代码难免会复杂许多,而使用EventBus能极大简化两个组件之间的通信问题,而且效率极高,而EventBus升级到3.0版本后,开发者能够自定义订阅方法的名字,而没必要规定以“onEventXX”开头的方法了,这样也自由化了很多,而且支持了粘性事件的分发等,因此学会使用EventBus3.0对我们的开发有极大的好处。
相比于EventBus 之前的版本。
- 订阅者的订阅方法的名字可以随意,不用必须写OnEvent(...);
- 必须要在订阅者的订阅方法上添加 @Subscribe(里面的内容后面有)次注解
- 新的版本添加粘性事件的分发、订阅者的线程工作、优先级的问题。使用更给力
和之前一样 注册和销毁 没变
//注册成为订阅者
EventBus.getDefault().register(this);
@Override
protected void onDestroy() {
super.onDestroy();
//解除注册
EventBus.getDefault().unregister(this);
}
//订阅方法,当接收到事件的时候,会调用该方法
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(MessageEvent messageEvent){
//这个OnEvent(...); 名字可以变化。但是必须加注解
}
下面聊一下@Subscribe
里面有三个注解可以使用分别为:
-
ThreadMode 代表订阅方法所运行的线程
- POSTING:表示订阅方法运行在发送事件的线程**(默认)
** - MAIN:表示订阅方法运行在UI线程,由于UI线程不能阻塞,因此当使用MAIN的时候,订阅方法不应该耗时过长。
- BACKGROUND:表示订阅方法运行在后台线程,如果发送的事件线程不是UI线程,那么就使用该线程;如果发送事件的线程是UI线程,那么新建一个后台线程来调用订阅方法。
- ASYNC:订阅方法与发送事件始终不在同一个线程,即订阅方法始终会使用新的线程来运行。
- POSTING:表示订阅方法运行在发送事件的线程**(默认)
-
sticky 代表是否是粘性事件
设置该优先级的目的是,当一个事件有多个订阅者的时候,优先级高的会优先接收到事件。 -
priority 代表优先级
关于粘性事件,可以参考Android的广播机制,其中有一个粘性广播,粘性广播的意思是:该广播发送后,会保存在内存中,如果后来有注册的Receiver与之匹配,那么该Receiver便会接收到该广播。那么粘性事件同理,在注册之前便把事件发生出去,等到注册之后便会收到最近发送的粘性事件(必须匹配)。注意:只会接收到最近发送的一次粘性事件,之前的会接受不到。(在注册后可以马上接受到离自己最近的一次事件)