博客
关于我
LiveData的分析与简单使用
阅读量:792 次
发布时间:2023-02-06

本文共 2844 字,大约阅读时间需要 9 分钟。

LiveData深入解析:从基础到高级功能全解析

LiveData是Android开发中一个非常重要的库,属于androidx.lifecycle-livedata包下的抽象类。它实现了一种关联生命周期的简单观察者模式,主要用于视图层与数据层之间的单向一对多通知。在Android开发中,LiveData已经成为处理UI状态与数据状态的标准工具。

1. LiveData的基本概念

LiveData的核心功能是一个可观察的数据持有者。它一开始处于NOT_SET状态。当通过setValue方法更新数据后,LiveData会遍历所有处于Active状态的观察者,通知它们数据的更新。LiveData的生命周期管理会避免许多Activity泄漏和空指针异常。

需要注意的是,LiveData的行为是基于Lifecycle的。它会根据当前的生命周期状态来决定是否通知观察者。

2. LiveData的使用方法

2.1 基本使用

// 声明一个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()}

2.2 高级使用

LiveData的Transformations工具类可以帮助我们对LiveData的数据类型进行转换。例如,如果我们从Retrofit获取了一个User类数据,但只想将User.name暴露给观察者,可以这样处理:

private val userLiveData: MutableLiveData
= MutableLiveData()val userNameLiveData: LiveData
= Transformations.map(userLiveData) { user -> user.name}

Transformations位于androidx.lifecycle包下。

2.3 MediatorLiveData

MediatorLiveData可以同时观察多个LiveData的变化。例如:

// 声明一个MediatorLiveDataval mediatorLiveData: MediatorLiveData
= MediatorLiveData()// 添加多个数据源mediatorLiveData.addSource(stringFromNetwork) { mediatorLiveData.value = it }mediatorLiveData.addSource(stringFromDatabase) { mediatorLiveData.value = it }

3. LiveData的内部机制

3.1 Lifecycle的作用

LiveData的行为严格依赖于Lifecycle。LifecycleOwner通常是Activity或Fragment,通过它们可以获得当前的生命周期状态。Lifecycle本身维护着各种生命周期状态,默认实现是LifecycleRegistry。开发者只需要通过getLifecycle()获取当前的生命周期即可。

3.2 LifecycleObserver

LifecycleObserver是一个接口,用于定义自定义的观察者。LiveData内部提供了一个LifecycleBoundObserver实现了这个接口。它会在onStateChange方法中接收生命周期状态的通知。

3.3 观察者管理

LiveData维护了一个SafeIterableMap存储观察者和对应的ObserverWrapper。当注册观察者时,会将其包装为LifecycleBoundObserver,并根据当前的生命周期状态决定是否需要注册。

3.4 dispatchValue和considerNotify

3.4.1 dispatchValue

dispatchValue方法负责将新值分发给所有处于活跃状态的观察者。它会先检查是否在分发过程中,若中断则跳出循环。然后遍历所有观察者,调用onChange方法。

3.4.2 considerNotify

considerNotify方法用于决定是否需要通知观察者。它会检查观察者的mActive状态和shouldBeActive()方法的返回值,以及版本号是否需要更新。

3.5 setValue和postValue

setValuepostValue方法用于赋值LiveData。postValue会在主线程执行setValue,避免多个postValue操作只执行最后一个。

4. LiveData的使用场景

4.1 Activity/Fragment生命周期管理

ViewModel可以持有LiveData,并在onCreateonDestroy之间保存实例,避免屏幕旋转等ConfigChange导致的状态丢失。

4.2 数据绑定

LiveData可以与UI绑定框架如View Binding配合使用,或者与数据层如Room数据库、网络请求等无缝对接。

4.3 嵌套LiveData

通过Transformations.mapTransformations.switchMap等工具,可以对LiveData进行复杂的转换和组合,实现多个LiveData的数据映射。

5. 总结

LiveData提供了一种简洁而高效的数据状态管理方式。通过合理使用LiveData和其配套工具,可以在Android开发中充分发挥其优势,避免常见的生命周期管理问题。同时,LiveData的灵活性使其可以与各种数据源无缝对接,支持复杂的UI状态和数据状态管理需求。

转载地址:http://vuufk.baihongyu.com/

你可能感兴趣的文章
Linux配置-【9】文件、目录相关指令
查看>>
Linux配置IPv6
查看>>
Linux配置IP命令
查看>>
Linux里的档案权限入门!!!
查看>>
Linux重启 Redis自动启动
查看>>
linux问题点滴,给普通用户添加sudo权限
查看>>
Linux防火墙-iptables
查看>>
linux防火墙iptables简单介绍
查看>>
Linux防火墙实现SNAT与DNAT
查看>>
Linux防火墙应用实践
查看>>
linux防火墙规则
查看>>
Linux静态库和共享库【转】
查看>>
Linux面试题总结
查看>>
Linux高手最常使用的五个快捷键,零基础入门到精通,收藏这一篇就够了
查看>>
linux高级技巧:heartbeat+lvs(二)
查看>>
linux高级数据存储
查看>>
Linux高阶知识:Linux 中的隐藏文件
查看>>
Linux(10):安装mysql5.7
查看>>
Linux(11):设置固定ip
查看>>
Linux(12):上传下载命令rz和sz
查看>>