EventBus
- EventBus2.x使用的是运行时注解,它采用了反射的方式对整个注册的类的所有方法进行扫描来完成注册,因而会对性能有一定影响。
- EventBus3.x使用的是编译时注解,Java文件会编译成.class文件,再对class文件进行打包等一系列处理。在编译成.class文件时,EventBus会使用EventBusAnnotationProcessor注解处理器读取@Subscribe()注解并解析、处理其中的信息,然后生成Java类来保存所有订阅者的订阅信息。这样就创建出了对文件或类的索引关系,并将其编入到apk中。
- 从EventBus3.0开始使用了对象池缓存减少了创建对象的开销。
EventBus原理简单的解释就是
- 注册时保持类信息及所对应的注册方法
- 发送时通过反射寻找符合要求的方法进行调用
- 线程切换操作是先把事务添加到一个队列中,使用Handler机制对这些事务进行处理
- 取消注册时移除已保存的类信息和方法
RxBus
一种实现,主要是用rxjava的事件总线机制对实现的,还是基于观察者模式
还有一种实现基本上是和EventBus一致的,区别就在于线程切换使用了比较优雅的rxjava
liveBusEvent
liveBusEvent基础的原理就是基于livedata进行实现的,可以感知生命周期,这是一大优势。
其中有个更改livedata的操作就是使用反射更改livedata 控制数据的分发,目的是为了处理会出现能感知到未注册之前的事件。
https://github.com/JeremyLiao/LiveEventBus
这个库中还加入了跨进程和跨app的通信,其实就是基于broadcast进行广播来实现的,广播的上下文如果没有初始化获取的话,就是基于反射去获取application的,这里可以借鉴一下
对比三个框架:
- EventBus 提供了解耦和便捷的线程切换操作。但是对于定义很多的事件类型比较麻烦,也有可能多人开发造成冲突。
- RxBus的最大优势应该就是它比较小,一个类就能实现。但是得基于rxjava,如果项目没有rxjava,其实和EventBus是差不多的。
- LiveEventBus 实现也比较简单,但是也是依赖于livedata感知生命周期这一块比较有优势。数据接收是在主线程,切换到其他线程还得自己操作。使用broadcast来实现跨进程也是一大特点