Sticky Events
有些事件在事件發佈後攜帶有感興趣的信息。例如,一個事件表示某個初始化已經完成。或者如果你有一些傳感器或位置數據,你想要保持最近的值。您可以使用粘性事件,而不是實現自己的緩存。因此EventBus將某個類型的最後一個粘性事件保存在內存中。然後可以將粘性事件交付給訂閱者或顯式查詢。因此,您不需要任何特殊的邏輯來考慮已經可用的數據。
示例:
可以在訂閱都訂閱之前,首先發送一個粘性事件:
EventBus.getDefault().postSticky(eventData);
在訂閱者的註冊過程中,所有的粘性訂閱者方法將立即得到之前發佈的粘性事件:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sticky);
mTvMessage = (TextView) this.findViewById(R.id.tv_message);
EventBus.getDefault().register(this);
}
// UI updates must run on MainThread
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void refreshMessage(final EventData eventData) {
Log.i(TAG, "method:refreshMessage#eventData=" + eventData);
mTvMessage.setText("已經接收到 eventData=" + eventData.toString());
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
手動獲取和刪除粘性事件:
正如您所看到的,當匹配的訂閱者註冊時,最後一個粘附事件將自動交付給他們。但有時手動檢查粘性事件可能更方便。此外,可能還需要刪除(消耗)粘性事件,以便不再交付它們。示例:
EventData stickyEventData = EventBus.getDefault().getStickyEvent(EventData.class);
// Better check that an event was actually posted before
if(stickyEventData != null) {
// "Consume" the sticky event
EventBus.getDefault().removeStickyEvent(stickyEventData);
// Now do something with it
}
方法:removeStickyEvent 重載:當您傳遞類時,它將返回以前保存的粘性事件。使用這個變量,我們可以改進前面的例子:
EventData stickyEventData = EventBus.getDefault().removeStickyEvent(EventData.class);
// Better check that an event was actually posted before
if(stickyEventData != null) {
// Now do something with it
}
另外的移除方法:
根據某個事件對象進行移除,如果事件匹配且粘性事件被刪除,則爲true。
boolean b = EventBus.getDefault().removeStickyEvent(eventData);
移除所有粘性事件:
EventBus.getDefault().removeAllStickyEvents();
由於作者水平有限,語言描述及代碼實現中難免有紕漏,望各位看官多提寶貴意見!
Hello , World !
感謝所有!