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
下載
- ofollow,noindex"> 本篇案例程式碼
總結
我們使用粘性事件的時候需要注意的是,當我們不想要改資料的時候一定要清空掉,或者在退出activity時直接清空掉,這樣不會影響我們的接收資料,根據自己的需求來設定