简介
例如:事件表示某些初始化已完成。或者,如果您有一些传感器或位置数据,并且您希望保留最新值。您可以使用粘性事件,而不是实现自己的缓存。因此,EventBus会将特定类型的最后一个粘性事件保留在内存中。然后,粘性事件可以传递给订阅者或明确查询。因此,您不需要任何特殊逻辑来考虑已有的数据,或者是当你在新启动一个新的Activity的时候,你想传达信息过去,可以根据粘性事件,就可以进行获取到数据,当然了,Intent事件肯定也可以传递信息数据的,但是在这里我们所要说的是EventBus的粘性事件。
进入测试
代码分析
比如我打开一个Activity页面我就发送了一个粘性事件如下。
EventBus.getDefault().postSticky(new MessageEvent("发送粘性事件!"));
然后我点击跳转到新的StickyTestActivity页面然后我进行接收该事件的数据信息,完全没有问题的接收到了信息(在注册期间,所有粘性订阅者方法将立即获得先前发布的粘性事件)。
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onMessageStickyEvent(MessageEvent event) {
Log.d(TAG, "onMessageStickyEvent。。。");
textView.setText(event.message);
//表示如果粘性事件不为空,则手动删除手动获取和删除粘性事件,
//testSticky方法无法获取粘性事件的信息了。
//MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
//if (stickyEvent != null) {
//EventBus.getDefault().removeStickyEvent(stickyEvent);
// testSticky();
//}
}
private void testSticky() {
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
//检查事件是否实际发布
if (stickyEvent != null) {
Log.d(TAG, "stickyEvent。。。");
textView.setText("接收信息:"+stickyEvent.message);
}
}
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
super.onDestroy();
}
手动获取和删除粘性事件
由上面的代码可以知道在onMessageStickyEvent()
方法中就是手动手动获取和删除粘性事件。这样testSticky()
方法就无法接收到消息数据了。
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
if (stickyEvent != null) {
EventBus.getDefault().removeStickyEvent(stickyEvent);
}
方法 removeStickyEvent被重载:当你传入类时,它将返回先前持有的粘性事件。使用此变体,我们可以改进前面的示例:
MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);
// 检查事件是否实际发布
if(stickyEvent != null) {
// do something
}
测试
1.进入页面就发送粘性事件发送数据字符串:发送粘性事件!
。
2.点击按钮跳转页面查看是否获取粘性事件发送的消息数据。
下载
总结
我们使用粘性事件的时候需要注意的是,当我们不想要改数据的时候一定要清空掉,或者在退出activity时直接清空掉,这样不会影响我们的接收数据,根据自己的需求来设置