EventBus粘性事件

簡介

例如:事件表示某些初始化已完成。或者,如果您有一些傳感器或位置數據,並且您希望保留最新值。您可以使用粘性事件,而不是實現自己的緩存。因此,EventBus會將特定類型的最後一個粘性事件保留在內存中。然後,粘性事件可以傳遞給訂閱者或明確查詢。因此,您不需要任何特殊邏輯來考慮已有的數據,或者是當你在新啓動一個新的Activity的時候,你想傳達信息過去,可以根據粘性事件,就可以進行獲取到數據,當然了,Intent事件肯定也可以傳遞信息數據的,但是在這裏我們所要說的是EventBus的粘性事件。

EventBus-Android的發佈 - 訂閱

進入測試

代碼分析

比如我打開一個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.點擊按鈕跳轉頁面查看是否獲取粘性事件發送的消息數據。

粘性發送測試.png

接收消息.png

下載

總結

我們使用粘性事件的時候需要注意的是,當我們不想要改數據的時候一定要清空掉,或者在退出activity時直接清空掉,這樣不會影響我們的接收數據,根據自己的需求來設置

推薦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章