本文共 2844 字,大约阅读时间需要 9 分钟。
LiveData是Android开发中一个非常重要的库,属于androidx.lifecycle-livedata包下的抽象类。它实现了一种关联生命周期的简单观察者模式,主要用于视图层与数据层之间的单向一对多通知。在Android开发中,LiveData已经成为处理UI状态与数据状态的标准工具。
LiveData的核心功能是一个可观察的数据持有者。它一开始处于NOT_SET
状态。当通过setValue
方法更新数据后,LiveData会遍历所有处于Active
状态的观察者,通知它们数据的更新。LiveData的生命周期管理会避免许多Activity泄漏和空指针异常。
需要注意的是,LiveData的行为是基于Lifecycle的。它会根据当前的生命周期状态来决定是否通知观察者。
// 声明一个LiveDataval data: MutableLiveData= MutableLiveData()// 在需要的地方订阅,observer的onChange方法会回调data.observe(lifecycleOwner, observer)// 可以和Retrofit配合使用interface ApiService { @GET("/api/get") fun getChannels(): LiveData }// 可以和Room配合使用@Daointerface BorrowModelDao { @Query("select * from s_borrow_model") fun getAllBorrowedItems(): LiveData
>}// 配合ViewModel保存数据/监听数据更改class MyViewModel: ViewModel() { val data: MutableLiveData = MutableLiveData()}
LiveData的Transformations
工具类可以帮助我们对LiveData的数据类型进行转换。例如,如果我们从Retrofit获取了一个User类数据,但只想将User.name暴露给观察者,可以这样处理:
private val userLiveData: MutableLiveData= MutableLiveData()val userNameLiveData: LiveData = Transformations.map(userLiveData) { user -> user.name}
Transformations
位于androidx.lifecycle包下。
MediatorLiveData可以同时观察多个LiveData的变化。例如:
// 声明一个MediatorLiveDataval mediatorLiveData: MediatorLiveData= MediatorLiveData()// 添加多个数据源mediatorLiveData.addSource(stringFromNetwork) { mediatorLiveData.value = it }mediatorLiveData.addSource(stringFromDatabase) { mediatorLiveData.value = it }
LiveData的行为严格依赖于Lifecycle。LifecycleOwner
通常是Activity或Fragment,通过它们可以获得当前的生命周期状态。Lifecycle
本身维护着各种生命周期状态,默认实现是LifecycleRegistry
。开发者只需要通过getLifecycle()
获取当前的生命周期即可。
LifecycleObserver
是一个接口,用于定义自定义的观察者。LiveData
内部提供了一个LifecycleBoundObserver
实现了这个接口。它会在onStateChange
方法中接收生命周期状态的通知。
LiveData维护了一个SafeIterableMap
存储观察者和对应的ObserverWrapper
。当注册观察者时,会将其包装为LifecycleBoundObserver
,并根据当前的生命周期状态决定是否需要注册。
dispatchValue
方法负责将新值分发给所有处于活跃状态的观察者。它会先检查是否在分发过程中,若中断则跳出循环。然后遍历所有观察者,调用onChange
方法。
considerNotify
方法用于决定是否需要通知观察者。它会检查观察者的mActive
状态和shouldBeActive()
方法的返回值,以及版本号是否需要更新。
setValue
和postValue
方法用于赋值LiveData。postValue
会在主线程执行setValue
,避免多个postValue操作只执行最后一个。
ViewModel可以持有LiveData,并在onCreate
到onDestroy
之间保存实例,避免屏幕旋转等ConfigChange导致的状态丢失。
LiveData可以与UI绑定框架如View Binding配合使用,或者与数据层如Room数据库、网络请求等无缝对接。
通过Transformations.map
、Transformations.switchMap
等工具,可以对LiveData进行复杂的转换和组合,实现多个LiveData的数据映射。
LiveData提供了一种简洁而高效的数据状态管理方式。通过合理使用LiveData和其配套工具,可以在Android开发中充分发挥其优势,避免常见的生命周期管理问题。同时,LiveData的灵活性使其可以与各种数据源无缝对接,支持复杂的UI状态和数据状态管理需求。
转载地址:http://vuufk.baihongyu.com/