kururunga 2015-05-17
EventBus进阶(二)
上一篇简单介绍了EventBus的简单用法,下面来介绍下EventBus的其它的一些用法
EventBus.getDefault().register(this, priority);
在同一个线程级别中,订阅者的优先级越高,就越先收到消息,默认优先级是0
EventBus eventBus = EventBus.builder().logNoSubscriberMessages(false).sendNoSubscriberEvent(false).build();
EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).installDefaultEventBus();
// Called in the same thread (default) public void onEvent(MessageEvent event){ // Process the event ... EventBus.getDefault().cancelEventDelivery(event) ; }
当事件post之后,我们可能要获得这些事件携带的一些数据,这个有时可以作为事件初始化完成的信号。或者你可以获取一些最新的信息,例如传感器和位置信息,这些数据每时每刻都在更新,可能我们最关心的却是最新的。你不必使用缓存,仅仅用sticky events就完全可以实现。EventBus会在内存中存储最后一个特定类型的sticky event。stikey event 可以准确的传递给所有的事件订阅者 ,因此,你不用需要处理任何特殊的逻辑去考虑哪些已经可用的数据。
看了eventBus的官方文档之后,其实我还是云里雾里的,这stikeyEvent能干嘛呢?按照个人的理解它是一个可以被缓存的事件,而用一般的事件,你会发现当Activity跳转的时候,事件所携带的信息是不能带过去的,也就是说一般的Event是不会被缓存的。前面介绍eventBus的时候,它是可以替代android 组件之间通讯的,那是不是可以使用stikeyEvent可以实现呢?答案是肯定的。
下面介绍如何使用StikeyEvent实现ActivityA和Activity B之间进行通讯
EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));
@Override public void onStart() { super.onStart(); EventBus.getDefault().registerSticky(this); }
public void onEventMainThread(MessageEvent event) { textField.setText(event.message); }
@Override public void onStop() { EventBus.getDefault().unregister(this); super.onStop(); }
EventBus.getDefault().getStickyEvent(Class<?> eventType)
-keepclassmembers class ** { public void onEvent*(**); } # Only required if you use AsyncExecutor -keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent { <init>(java.lang.Throwable); }
混淆代码的时候千万别忘记了加上