日更 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);
}
网友评论