EventBus 簡單使用(二)
ofollow,noindex">EventBus 簡單使用(一)
日更 14 天。
本文主要介紹以下兩個知識點,重點是粘性事件
- 粘性事件
- 混淆
上文簡單介紹瞭如何使用使用EventBus
,它的post
事件只能接收一次訊息,不呼叫post
事件,訊息處理方法中是不會再接收到事件的。而且Post
方式的能接收訊息的前提是你的register
需要在Post
操作之前,否則就會接收不到訊息。所以EventBus的粘性事件
就是為了解決這個問題而生。
Post 事件簡單理解就好比我訂閱了某雜誌社一個月的雜誌,雜誌社每週六固定給我送一本雜誌過來,有一天我想提前看下一週的雜誌,這時候還用原來的策略肯定是看不到雜誌的。
PostSticky 粘性事件簡單理解就好比這時候雜誌社為了搞促銷,聲明瞭只要是訂閱了他們家雜誌的使用者,都能夠收到每期的電子雜誌,這時候只要你訂閱了這家雜誌社的雜誌,都會收到電子雜誌。
粘性事件 使用例子
傳送粘性事件
EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));
處理粘性事件
@Override public void onResume() { super.onResume(); EventBus.getDefault().register(this); } /** * UI updates must run on MainThread * 這裡一定要設定 sticky=true,否則接受不到粘性事件 */ @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) public void onEvent(MessageEvent event) { textField.setText(event.message); // 如果之後不用該粘性事件可直接移除粘性事件 EventBus.getDefault().removeStickyEvent(event); } @Override public void onPause() { EventBus.getDefault().unregister(this); super.onPause(); }
移除粘性事件在上面的程式碼中也介紹,如果不那麼做還可以在
onDestory
中移除
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 }
混淆
-keepattributes *Annotation* -keepclassmembers class * { @org.greenrobot.eventbus.Subscribe <methods>; } -keep enum org.greenrobot.eventbus.ThreadMode { *; } # Only required if you use AsyncExecutor -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent { <init>(java.lang.Throwable); }