EventBus的StickyEvents黏性事件详解及使用说明


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)




你可能感兴趣的:(Android积累)