EventBus进阶(二)


   EventBus进阶(二)

上一篇简单介绍了EventBus的简单用法,下面来介绍下EventBus的其它的一些用法

1 事件订阅的优先级的使用

EventBus.getDefault().register(this, priority);

在同一个线程级别中,订阅者的优先级越高,就越先收到消息,默认优先级是0

2 使用EventBusBuilder配置EnventBus

      EventBus2.3新增使用EventBusBuilder 去配置各种不同的EventBus,例如去创建一个没有订阅者的EventBus
    
EventBus eventBus = EventBus.builder().logNoSubscriberMessages(false).sendNoSubscriberEvent(false).build();
      当订阅者发生异常的时候,我们可以创建一个捕捉订阅者异常的EventBus(EventBus默认是会捕捉订阅者发生的异常的)
EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).installDefaultEventBus();
3 取消事件传递
// Called in the same thread (default)
    public void onEvent(MessageEvent event){
        // Process the event 
        ...
        EventBus.getDefault().cancelEventDelivery(event) ;
    }

4 使用StickeyEvent实现android组件之间进行通讯

     当事件post之后,我们可能要获得这些事件携带的一些数据,这个有时可以作为事件初始化完成的信号。或者你可以获取一些最新的信息,例如传感器和位置信息,这些数据每时每刻都在更新,可能我们最关心的却是最新的。你不必使用缓存,仅仅用sticky events就完全可以实现。EventBus会在内存中存储最后一个特定类型的sticky event。stikey event 可以准确的传递给所有的事件订阅者 ,因此,你不用需要处理任何特殊的逻辑去考虑哪些已经可用的数据。

     看了eventBus的官方文档之后,其实我还是云里雾里的,这stikeyEvent能干嘛呢?按照个人的理解它是一个可以被缓存的事件,而用一般的事件,你会发现当Activity跳转的时候,事件所携带的信息是不能带过去的,也就是说一般的Event是不会被缓存的。前面介绍eventBus的时候,它是可以替代android 组件之间通讯的,那是不是可以使用stikeyEvent可以实现呢?答案是肯定的。

下面介绍如何使用StikeyEvent实现ActivityA和Activity B之间进行通讯

  •  ActivityA跳转到ActivityB的时候,post事件
EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));
  • 当Activity B启动的时候,注册stickyEvent
@Override
    public void onStart() {
        super.onStart();
        EventBus.getDefault().registerSticky(this);
    }
  •  Activity B中新建一个接收StickyEvent事件的方法
public void onEventMainThread(MessageEvent event) {
        textField.setText(event.message);
    }
  •  反注册StickyEvent
@Override
    public void onStop() {
        EventBus.getDefault().unregister(this);
        super.onStop();
    }
补充:1 你可以调用removeStickyEvent 方法移除之前post的StikeyEvent
           2 可以得到最后一个特定类型的StickyEvent
EventBus.getDefault().getStickyEvent(Class<?> eventType)
 

5 ProGuard 配置

-keepclassmembers class ** {
    public void onEvent*(**);
}
# Only required if you use AsyncExecutor
-keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}

 混淆代码的时候千万别忘记了加上

 

   

 
 
 
 
 
 
 
 
 
 
 
 

 

相关推荐