EventBus的StickyEvents黏性事件详解及使用说明
2016-09-12 13:53
302 查看
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
}
黏性事件处理函数:
发送黏性事件:
处理消息事件以及取消订阅和上面方式相同。
最后说一句,配合着Activity或者fragment的生命周期会获得意想不到的结果。当然如果当前的Activity或者fragment已经结束了(调用onStop()),只要是使用的是EventBus的粘性事件也可以执行已经结束了生命周期里的方法,前提就是@Subscribe(sticky
= true);
看看官网的描述
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);
相关文章推荐
- EventBus使用步骤(二):黏性事件(每天学一点)
- EventBus使用详解-2-用RxJava实现事件总线(Event Bus)
- javascript中的prototype方法使用说明(详解)
- 关于linux系统中命令的使用详解2(附带有例子说明)
- Flash AS3 鼠标事件使用详解
- BackTrack 4.0 系统菜单中Backtrack目录详解 及工具使用说明
- epoll使用详解说明
- InfoPath窗体事件列表说明和示例使用
- [J2EE]DBCP、C3P0、Proxool三大连接池的配置参数说明和使用详解
- jQuery bind事件使用详解
- jQuery bind事件使用详解
- JQuery批量上传插件Uploadify使用详解及参数说明
- javascript中的prototype方法使用说明(详解)
- JavaScript 事件记录使用说明
- linux struct utsname 结构详解是utsname 函数使用说明
- JavaScript 滚轮事件使用说明
- AppFramework1.0数据库访问组件使用说明(五)IDBSession使用详解
- Android 四大组件之(3)BroadcastReceiver广播事件处理以及与Notification的配合使用详解
- 关于linux系统中命令的使用详解1(附带有例子说明)
- mpiBlast安装详解以及使用说明