EventBus 3使用文档(二)

来源:互联网 发布:au录音软件win10 编辑:程序博客网 时间:2024/05/21 10:31

配置EventBus

EventBusBuilder类为EventBus提供了许多方面的配置属性。比如,下面的例子就是如何创建一个自定义的EventBus,它在发布一个没有订阅者的事件时,不会做任何额外的事(输出任何日志、发送无订阅者事件)。

EventBus eventBus = EventBus.builder()    .logNoSubscriberMessages(false)    .sendNoSubscriberEvent(false)    .build();

再举一个例子,这个自定义的EventBus会在订阅方法抛出异常时失败(译者注:失败是指会立即在所在线程抛出异常。通常情况下,这样的处理方式会导致程序崩溃)。

EventBus eventBus = EventBus.builder().throwSubscriberException(true).build();

说明:默认情况下,EventBus会捕捉订阅方法抛出的异常,并且包装成一个SubscriberExceptionEvent事件发送出去。使用者可以订阅并处理这个事件,也可以直接忽略。

更多的配置项,参见文档:EventBusBuilder class and its JavaDoc

设置默认的EventBus

使用EventBus.getDefault()是一个便捷的获取共享EventBus实例的方法,在app的任何地方。EventBusBuilder允许自己设置默认的EventBus,通过installDefaultEventBus()方法。

比如,希望配置一个默认的EventBus,它只会在DEBUG编译模式下才会重新抛出订阅方法执行过程中的异常,因为大多时候,重新抛出异常会导致app崩溃。

EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).installDefaultEventBus();

说明:这只能在使用默认的EventBus之前操作才能成功。如果在之后调用installDefaultEventBus()会抛出异常。这确保了你的app的行为一致。你的Application子类是配置默认EventBus的好地方。

粘性事件(Sticky Events)

有些事件携带的信息哪怕是在事件发送完成之后仍然有效。比如说,某个初始化完成的信号事件;或者某些传感器或定位数据的最近一次数据想要保存下来。现在你可以不用自己实现缓存,而是使用粘性事件。EventBus会把每种类型的最后一次粘性事件保持在内存中,从而使订阅者可以收到或查询到该事件。因此,你不需要额外的逻辑去处理已经存在的数据。

粘性例子

举例来说,一个粘性事件在之前已经被发送出去了:

EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));

现在,一个新的Activity启动了。在注册的时候,所有粘性订阅方法都会立刻收到之前发出的粘性事件

@Overridepublic void onStart() {    super.onStart();    EventBus.getDefault().register(this);}// UI updates must run on MainThread@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)public void onEvent(MessageEvent event) {       textField.setText(event.message);}@Overridepublic void onStop() {    EventBus.getDefault().unregister(this);        super.onStop();}

手动获取和移除粘性事件

正如你上面看到的,在注册订阅者时,最后一次的粘性事件被自动分发到了匹配的订阅者。但是有时候,主动去查询粘性事件可能更方便。同时,你可能也会需要把粘性事件移除(或者称之为消费),这样它们就不会再被分发给后续的订阅者了。例子:

MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);// Better check that an event was actually posted beforeif(stickyEvent != null) {    // "Consume" the sticky event    EventBus.getDefault().removeStickyEvent(stickyEvent);    // Now do something with it}

removeStickyEvent方法其实可以为你承担地更多:当你传入class,它会把之前持有的粘性事件返回。因此,你可以这样改变来改进你的代码:

MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);// Better check that an event was actually posted beforeif(stickyEvent != null) {    // Now do something with it}
0 0
原创粉丝点击