EventBus还支持发送黏性事件。何为黏性事件呢?简单讲,就是在发送事件之后再订阅该事件也能收到该事件,跟黏性广播类似。
看看官网的描述
Some events carry information that is of interest after the event is posted. For example, an event signals that some initialization is complete. Or if you have some sensor or location data and you want to hold on the most recent values. Instead of implementing your own caching, you can use sticky events. EventBus keeps the last sticky event of a certain type in memory. The sticky event can be delivered to subscribers or queried explicitly. Thus, you don’t need any special logic to consider already available data.
直接翻译:
一些事件进行信息感兴趣的事件后发布。 例如,一个事件信号,一些初始化完成。 或者如果你有传感器位置数据和你想抓住最近的值。 而不是实现自己的缓存,您可以使用黏性的事件。 EventBus保持过去的事件的特定类型在内存中。 黏性的事件可以交付给用户或显式查询。 因此,你不需要任何特殊的逻辑来考虑可用的数据。
demo1
第一步:
EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));
第二步:现在,粘性事件发布,开始一个新的活动。 在注册过程中粘性用户所有方法将立即得到前面贴粘性的事件:
首先需要注册订阅事件
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN) //这种写法达到粘性的目的
public void onEvent(MessageEvent event) {
// UI updates must run on MainThread
textField.setText(event.message);
}
然后在onDestory()方法中取消订阅:防止内存溢出
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
// Better check that an event was actually posted before
if(stickyEvent != null) {
// "Consume" the sticky event
EventBus.getDefault().removeStickyEvent(stickyEvent);
// Now do something with it
}
removeStickyEvent方法重载
可以优化为:
MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);
// Better check that an event was actually posted before
if(stickyEvent != null) {
// Now do something with it
}
订阅黏性事件:
EventBus.getDefault().register(StickyModeActivity.this);
黏性事件处理函数:
@Subscribe(sticky = true)//最主要就是增加了这里,其它几乎跟eventbus的正常使用一样实现
public void XXX(MessageEvent messageEvent) {
......
}
发送黏性事件:
EventBus.getDefault().postSticky(new MessageEvent("test"));
处理消息事件以及取消订阅和上面方式相同。
最后说一句,配合着Activity或者fragment的生命周期会获得意想不到的结果。当然如果当前的Activity或者fragment已经结束了(调用onStop()),只要是使用的是EventBus的粘性事件也可以执行已经结束了生命周期里的方法,前提就是@Subscribe(sticky = true);