簡介
例如:事件表示某些初始化已完成。或者,如果您有一些傳感器或位置數據,並且您希望保留最新值。您可以使用粘性事件,而不是實現自己的緩存。因此,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時直接清空掉,這樣不會影響我們的接收數據,根據自己的需求來設置