EventBus 使用总结

2025-06-09 10:01:18

EventBus 使用总结

为什么要用EventBus?

EventBus是一个事件总线框架,观察者模式的变形,利用这个框架,我们可以方便高效地在Android组件间传递和处理数据,切换线程,降低代码耦合度。

本文基于 EventBus 3.0。

简单使用

* 配置build.gradle

* 观察者Java代码(以Activity为例)

* 发送事件

发送事件后,所有订阅事件的观察者会回调包含 @Subscribe 这个注释且方法参数为String的方法,可以把String换成任何我们需要的Object来传递数据。

EventBus的进阶使用

线程模式

EventBus总共有四种线程模式:

1.ThreadMode.POSTING

这是缺省模式,onEvent会在发布事件的线程中运行,即发布事件和接收处理事件将会运行在同一个线程。

这种模式下不要在onEvent中执行耗时操作,否则会延迟其他观察者的对事件的接收,阻塞线程。

2.ThreadMode.MAIN

不论事件是在哪个线程中发布出来的,onEvent都会在UI线程中执行,即接收处理事件运行在UI线程中。

当分发事件的线程不在UI线程中时,可以使用这种方法来更新UI。

这种模式下不要在onEvent中执行耗时操作,否则会延迟其他观察者的对事件的接收,阻塞线程。

3.ThreadMode.BACKGROUND

如果事件从UI线程中分发,那么onEvent就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEvent函数直接在该子线程中执行。

这种模式下不要在onEvent中执行耗时操作,否则会延迟其他观察者的对事件的接收,阻塞线程。

4.ThreadMode.ASYNC

无论事件在哪个线程发布,都会创建新的子线程来执行onEvent。

* 举例

粘性事件和事件优先级

* 粘性事件

这样即便事件先发出去,观察者后订阅的事件,也可以回调onEvent

* 事件优先级

事件发送后,会按照优先级的顺序来接收事件。

注解处理器

上文中对EventBus的使用是最基本的使用方法,因为观察者类信息要通过反射获取,所以效率有所欠缺,这里推荐使用Google的注解处理器AnnotationProcessor,在编译期获取类信息,生成索引,提高运行效率。

*配置build.gradle

* 应用初始化时配置

这样配置之后,EventBus的效率就得到了提高,具体使用方法和之前相同。

使用EventBus后的代码混淆

使用EventBus后,代码混淆配置如下: