android事件通信方案对比与LiveDataBus详解

萝らか妹 提交于 2019-11-27 16:08:49

事件通信

定义:Activity、fragment、Service、Provider之间进行信息的传递和交换

通信方案比较

通信方案 优点 缺点
handler 系统原生,能实现线程间通信 高耦合
不利于维护
容易导致内存泄漏和空指针
broadcast 简单 性能差
传播数据有限
打乱代码的执行逻辑
interface 速度快,容易理解 实现复杂,不利于维护
rxBus 效率高,无内存泄漏 基于rxjava,学习成本高且依赖包太大,rxjava2.2M
EventBus 使用简单 混淆问题
无法感知组件生命周期
实现复杂
LiveDataBus 实现极其简单
代码量少
官方提供稳定的依赖代码
感知组件生命周期
不存在内存泄漏

从上面对比可以看出,LiveDataBus是最优方案,那么接下来我们详细介绍LiveDataBus

LiveDataBus

LiveDataBus,是基于LiveData,利用发布订阅模式来实现的事件通信方案,那么我们就要解决以下几个问题

  • 什么是发布订阅模式
  • 什么是LiveData
  • 如何构建LiveDataBus

什么是发布订阅模式

  1. 它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。
  2. 发布订阅模式和观察者模式的区别
  • 在观察者模式中,观察者是知道Subject的,Subject一直保持对观察者进行记录。然而,在发布订阅模式中,发布者和订阅者不知道对方的存在。它们只有通过调度中心(消息代理)进行通信。
  • 在发布订阅模式中,组件是松散耦合的,正好和观察者模式相反。
  • 观察者模式大多数时候是同步的,比如当事件触发,Subject就会去调用观察者的方法。而发布-订阅模式大多数时候是异步的(使用消息队列)。
  • 观察者模式需要在单个应用程序地址空间中实现,而发布-订阅更像交叉应用模式

什么是LivaData

  1. 定义:一个数据持有类,持有数据并且这个数据可以被观察被监听,和其他observable不同的是,它是Lifecycle是绑定的,在生命周期内使用有效,减少内存泄漏和引用问题
  2. LiveData特征
LiveData优点 解释
UI和实时数据保持一致 因为LiveData采用的是观察者模式,这样一来就可以在数据发生改变时获取通知,更新UI
避免内存泄漏 观察者被绑定到组件的生命周期上,当被绑定的组件销毁时,观察者会立刻自动清理自身的数据
不会再产生由于Activity处于stop状态而引起的崩溃 当Activity处于后台状态时,是不会收到LiveData的任何事件的
不需要再解决生命周期带来的问题 LiveData可以感知被绑定的组件的生命周期,只有在活跃状态才会通知数据变化
实时数据刷新 当组件处于活跃状态或者从不活跃状态到活跃状态时总是能收到最新的数据
解决Configuration Change问题 当屏幕发生旋转或者被回收再次启动,立刻就能收到最新的数据
  1. 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

  1. LiveDataBus源码地址(含注释)
  2. LiveDataBus源码详解
  3. 更成熟的LiveEventBus
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!