粘性事件(Sticky Events)
如果app中有定位或传感器数据,你需要获取最新的数据;你可以考虑使用粘性事件而不是自己去获取。EventBus 将最新的粘性事件保存在内存中。粘性事件可以被传递给订阅者或显示查询。因此,你不需要任何特殊逻辑去获取已有的数据。
例子(Sticky Example)
一个粘性事件被发布在较早之前。
EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));
现在,打开一个新的Activity a界面,在Activity a里面注册为订阅者后,Activity a里面所有接收粘性事件的方法将会收到之前发布的粘性事件。
@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);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
手动获取和移除粘性事件(Getting and Removing sticky Events manually)
正如你之前看到的,最近发布的粘性事件在其新订阅者注册后将会自动传递给新订阅者。但有时可能更方便手动检查粘性事件。有时我们也需要移除粘性事件,以免它在传递下去。
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
}