LiveData的实现原理?
LiveData是Android Jetpack组件库中的一个用于在应用程序组件之间进行数据通信的组件。LiveData的实现原理主要涉及以下几个关键方面:
1.观察者模式:
LiveData基于观察者模式,它将数据的变化通知给观察者(订阅者)。
LiveData维护了一个观察者列表,当数据发生变化时,会遍历观察者列表,并通知每个观察者。
2.生命周期感知:
LiveData是一个生命周期感知的组件,它可以感知宿主组件(如Activity、Fragment)的生命周期状态变化。
LiveData会自动管理观察者的生命周期,并在宿主组件处于活跃状态时通知观察者,而在非活跃状态下停止通知。
3.线程安全:
LiveData保证数据的更新和通知操作是在主线程进行的,以确保数据更新的安全性和一致性。
当数据发生变化时,LiveData会在主线程中通知观察者,从而避免了多线程操作数据的问题。
4.背压支持:
LiveData提供了背压支持,可以处理观察者无法及时处理所有数据变化的情况。
当观察者无法及时处理数据变化时,LiveData会根据背压策略进行处理,如丢弃最新数据、缓存数据等。
5.数据粘性:
LiveData支持数据粘性,即当观察者订阅LiveData时,会立即收到最近的数据,而不仅仅是后续的数据变化。这对于初始化数据或恢复状态很有用,确保观察者能够立即获取到最新的数据。
通过以上实现原理,LiveData提供了一种简单而强大的方式,使应用程序组件能够轻松地观察数据的变化并响应。LiveData的生命周期感知、线程安全和背压支持等特性,使得数据通信更加可靠、安全和高效。LiveData广泛应用于MVVM架构中,配合ViewModel来实现数据的观察和响应。
LiveData数据倒灌问题?如何解决?
一.什么是数据倒灌以及场景
LiveData数据倒灌(LiveData data backflow)是指在某些情况下,LiveData在观察者注册之前发送数据的现象。这可能会导致观察者在注册后立即接收到先前的数据更新,即数据倒灌。
LiveData设计的初衷是在观察者活跃状态时才将数据发送给观察者,以确保数据更新与观察者的生命周期相匹配。然而,由于某些特殊情况,LiveData可能会在观察者注册之前产生数据更新,从而导致数据倒灌问题。一些可能引起LiveData数据倒灌问题的情况包括:
1.配置变更:
当配置发生变化时,如屏幕旋转、语言切换等,Activity或Fragment会被销毁并重新创建。
在重新创建之前,LiveData可能会更新数据,导致新创建的观察者接收到先前的数据。
2.后台任务:
LiveData可以与异步任务或后台线程结合使用,例如使用ViewModel和Coroutines或RxJava执行后台任务。
如果在后台任务完成之前注册观察者,LiveData可能会在观察者注册后立即发送先前的数据。
二.数据倒灌源码解析
出现这个问题的原因: LiveData 内部的 mVersion 属性和 LiveData 内部类 ObserverWrapper 内部的 mLastVersion 属性之间会作比较,在订阅时只要 mLastVersion 小于 mVersion 就会强制推送最新的消息。LiveData 只要调用过 setValue 或者 postValue 都会使 mVersion++ ,而不管是 LiveData 或者是 LiveData.ObserverWrapper ,其 version 初始值都是 -1 ,只要用 LiveData 设置了值后它的 mVersion 值无论如何都大于 -1 了,这时再进行订阅就会马上收到最后发出的消息了。
三.如何解决LiveData数据倒灌问题
1.使用反射解决版本问题,
2.使用官方提供的SingleLiveData
3.第三方:UnPeekLiveData
LiveData事件总线封装
https://juejin.cn/post/6844904005907251214
LiveDataBus 和 EventBus 一样作为消息总线来使用,但实际上它算是一种模式,例如 RxBus 依托于 RxJava 的支持,仅用了不到 30 行代码便可实现一个新的消息总线;而 LiveDataBus 与之类似,依托于官方的 LiveData ,我们便可以自己写出一个消息总线,并且这个消息总线是具有生命周期感知能力的。