事件通信
定义:Activity、fragment、Service、Provider之间进行信息的传递和交换
通信方案比较
通信方案 | 优点 | 缺点 |
---|---|---|
handler | 系统原生,能实现线程间通信 | 高耦合 不利于维护 容易导致内存泄漏和空指针 |
broadcast | 简单 | 性能差 传播数据有限 打乱代码的执行逻辑 |
interface | 速度快,容易理解 | 实现复杂,不利于维护 |
rxBus | 效率高,无内存泄漏 | 基于rxjava,学习成本高且依赖包太大,rxjava2.2M |
EventBus | 使用简单 | 混淆问题 无法感知组件生命周期 实现复杂 |
LiveDataBus | 实现极其简单 代码量少 官方提供稳定的依赖代码 感知组件生命周期 不存在内存泄漏 |
从上面对比可以看出,LiveDataBus是最优方案,那么接下来我们详细介绍LiveDataBus
LiveDataBus
LiveDataBus,是基于LiveData,利用发布订阅模式来实现的事件通信方案,那么我们就要解决以下几个问题
- 什么是发布订阅模式
- 什么是LiveData
- 如何构建LiveDataBus
什么是发布订阅模式
- 它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。
- 发布订阅模式和观察者模式的区别
- 在观察者模式中,观察者是知道Subject的,Subject一直保持对观察者进行记录。然而,在发布订阅模式中,发布者和订阅者不知道对方的存在。它们只有通过调度中心(消息代理)进行通信。
- 在发布订阅模式中,组件是松散耦合的,正好和观察者模式相反。
- 观察者模式大多数时候是同步的,比如当事件触发,Subject就会去调用观察者的方法。而发布-订阅模式大多数时候是异步的(使用消息队列)。
- 观察者模式需要在单个应用程序地址空间中实现,而发布-订阅更像交叉应用模式
什么是LivaData
- 定义:一个数据持有类,持有数据并且这个数据可以被观察被监听,和其他observable不同的是,它是Lifecycle是绑定的,在生命周期内使用有效,减少内存泄漏和引用问题
- LiveData特征
LiveData优点 | 解释 |
---|---|
UI和实时数据保持一致 | 因为LiveData采用的是观察者模式,这样一来就可以在数据发生改变时获取通知,更新UI |
避免内存泄漏 | 观察者被绑定到组件的生命周期上,当被绑定的组件销毁时,观察者会立刻自动清理自身的数据 |
不会再产生由于Activity处于stop状态而引起的崩溃 | 当Activity处于后台状态时,是不会收到LiveData的任何事件的 |
不需要再解决生命周期带来的问题 | LiveData可以感知被绑定的组件的生命周期,只有在活跃状态才会通知数据变化 |
实时数据刷新 | 当组件处于活跃状态或者从不活跃状态到活跃状态时总是能收到最新的数据 |
解决Configuration Change问题 | 当屏幕发生旋转或者被回收再次启动,立刻就能收到最新的数据 |
- LivaDataBus替代EventBus的理由
LiveDataBus优点 | 解释 |
---|---|
LiveDataBus的实现极其简单 | 相比EventBus复杂的实现,LiveDataBus只需要一个类就可以实现 |
LivaDataBus可以减小apk包的大小 | LiveDataBus只依赖Android官方组件LiveData,本身只一个类。EventBus 57Kb,RxJava 2.2M |
LiveDataBus依赖方支持更好 | LiveDataBus只依赖Android官方组件LiveData,相比RxBus依赖的RxJava和RxAndroid,依赖方支持更好 |
LiveDataBus具有生命周期感知 | LiveDataBus具有生命周期感知,在Android系统中使用调用者不需要调用凡注册,相比EventBus和RxBus使用更为方便,并且没有内存泄漏风险 |
如何构建LiveDataBus
来源:https://blog.csdn.net/qq_23081779/article/details/99693939