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}
- EventBus 3使用文档(二)
- EventBus 3使用文档(一)
- EventBus 3使用文档(三)
- EventBus 3使用文档(四)
- EventBus使用(二)
- EventBus使用(二)
- EventBus使用详解(二)
- EventBus的使用(二)
- EventBus使用详解(二)
- EventBus使用详解(二)—— EventBus使用进阶
- droid中EventBus使用详解(二)
- eventbus的使用(二)简洁易懂
- EventBus源码详解(二):进阶使用
- EventBus使用详解(二)
- Eventbus 3官方文档翻译(一)
- EventBus 《二》 Android EventBus的简单使用
- EventBus实例教程(二)
- EventBus详解(二)
- CSS-字体
- 最小的应用(tkinter,Python3.x )
- 机器学习模型评价指标 -- 混淆矩阵
- 数据结构与算法之经典排序
- Codeforces 516A Drazil and Factorial【暴搜找规律+贪心】
- EventBus 3使用文档(二)
- 轻快的VIM(一):移动
- centos7 安装Nginx
- 算法整理-二分查找列表最大值
- 1. hadoop 1.0.0 source code
- Android事件分发机制
- 简单说说 angularJs 中的 MVC
- android 高性能开发规范
- EventBus 3使用文档(三)