使用步骤:
1.build.gradle添加引用
compile 'org.greenrobot:eventbus:3.0.0'
2.订阅/解除订阅
订阅
EventBus.getDefault().register(this);//订阅
解除订阅
EventBus.getDefault().unregister(this);//解除订阅
3.定义一个事件类型
/** * 传递事件实体类(EventBus发送此类事件给订阅者) */ public class MessageEvent { public String name; public MessageEvent(String name) { this.name = name; } } 4.发布事件(普通事件) EventBus.getDefault().post(new MessageEvent(“name”,”password”)); 5.订阅事件处理
/** * 声明订阅方法:当接收到事件的时候,会调用该方法 * 使用@Subscribe注解 * */ @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(EventBusMessage msg) { Log.d("eventBusThread", "ThreadMode.MAIN " + Thread.currentThread().getName()); }
接收消息:可以有四种线程模型选择 ThreadMode总共四个:
- NAIN UI主线程
- BACKGROUND 后台线程
- POSTING 和发布者处在同一个线程
- ASYNC 异步线程
加注解提示:在写接收消息的方法是,方法名可以自定义,权限必须是
public。
6.终止事件往下传递
发送有序广播可以终止广播的继续往下传递,EventBus也实现了此功能
EventBus.getDefault().cancelEventDelivery(event) ;//优先级高的订阅者可以终止事件往下传递
EventBus黏性事件
上面的普通事件,都是需要先注册(register),再post,才能接受到事件;如果你使用postSticky发送事件,那么可以不需要先注册,也能接受到事件,也就是一个延迟注册的过程。
通过 postSticky 发送粘性事件,这个事件不会只被消费一次就消失,而是一直存在系统中,知道被 removeStickyEvent 删除掉。那么只要订阅了该粘性事件的所有方法,只要被register 的时候,就会被检测到,并且执行。订阅的方法需要添加 sticky = true 属性。
概念: 黏性事件就是指在EventBus内部被缓存的那些事件
原理: EventBus为每个类(class)类型保存了最近一次被发送的事件——sticky。后续被发送过来的相同类型的sticky事件会自动替换之前缓存的事件。当一个监听者向EventBus进行注册时,它会去请求缓存事件。这时,缓存的事件就会立即自动发送给这个监听者,有一定的延时性.
EventBus除了普通事件也支持粘性事件,这个有点类似广播分类中的粘性广播。本身粘性广播用的就比较少,为了方便理解成订阅在发布事件之后,但同样可以收到事件。订阅/解除订阅和普通事件一样,但是处理订阅函数有所不同,需要注解中添加sticky = true,是启动黏性事件
1 2 3 4 |
|
@Subscribe(sticky = true),也可以处理普通事件
发送粘性事件
EventBus.getDefault().postSticky(new EventBusStickyMessage());
如果不需要黏性事件我们可以移除
//表示如果粘性事件不为空,则手动删除手动获取和删除粘性事件
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
if (stickyEvent != null) {
EventBus.getDefault().removeStickyEvent(stickyEvent);
}
或者调用移除所有粘性事件
EventBus.getDefault().removeAllStickyEvents();