前言
目前市面上流行的客户端app的架构基本都是基于MVVM 设计的,因此,学习MVVM就显得格外重要了,MVVM的框架结构网上很多文章都有介绍,这里就不介绍了,上一篇介绍了DataBinding的使用,这边继续学习LiveData,同样是MVVM的重要组成部分。
1 LiveData介绍:
官方介绍的是说:LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 activity、fragment 或 service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
说简单就是 LiveData 是一个可观察的数据存储类,内部借助了 Lifecycle,从而实现了生命周期感知,同时,这个可观察指的是,在其存储的数据更新时,它会去通知观察者。又因为生命周期感知的存在,所以可以做到 何时通知、何时解绑,从而做到安全无泄漏,就是如此:)
LiveData是基于Lifecycle上开发的,没有 Lifecycle,也不会存在 LiveData,在sdk26以后,Lifecycle已经被写入了我们 Androidx 基础组件,默认会在 ComponentActivity 及 Fragmeent 中初始化,并且支持开发者自行调用 lifecycle 对象,从而添加相应的生命周期观察者,从而免除模版代码。
2 LiveData 的原理
LiveData的工作机制基于观察者模式,其核心原理如下:
数据观察:开发者通过调用LiveData的observe
方法,将Observer(观察者)与LiveData实例关联起来。Observer可以是一个Activity、Fragment或其他实现了LifecycleOwner接口的对象。
数据更新:当LiveData持有的数据发生变化时,有两种方式可以更新数据:setValue
(只能在主线程使用)和postValue
(可以在任何线程使用,但会在主线程上更新数据)。
通知机制:当数据更新后,LiveData会检查当前是否有活跃的Observer(即其宿主Activity或Fragment处于活动状态)。如果有,LiveData会将数据变化通知给这些Observer,Observer随后会在UI线程上更新界面。
3 LiveData 的优势
LiveData在Android架构中扮演着连接数据层和UI层的重要角色,其优势包括:
生命周期感知:LiveData能够感知宿主的生命周期,确保在宿主处于活动状态时更新数据,避免在宿主不活跃时进行不必要的UI更新,从而减少资源浪费。
数据一致性:LiveData保证了数据状态的一致性,特别是在配置变更(如屏幕旋转)时,能够保持数据不变,避免数据丢失或重复加载。
内存泄漏防护:LiveData在宿主销毁时会自动清理与Observer的连接,从而避免内存泄漏。
线程安全:LiveData内部处理了线程切换的问题,确保数据更新和UI更新都在正确的线程上执行。
4 LiveData 和 Databinding 的差别
与Data Binding相比,LiveData具有生命周期感知能力,能够更智能地处理数据更新和UI更新之间的关系。而Data Binding更多地关注于将数据直接绑定到XML布局中的UI控件上,减少Java/Kotlin代码中的UI更新逻辑。两者在Android开发中经常结合使用,以实现更高级的数据绑定和响应式编程功能。
5 LiveData 的使用
1 基础用法
1.1 创建LiveData对象
创建MutableLiveData
对象,这里我们用基础的String代替
1.2、观察LiveData对象
通过observe
方法来监听LiveData
的数据变化,每当LiveData
发生变化时,都会回调onChanged
方法,并返回值的内容Strings
1.3、更新LiveData对象
通过LiveData
的setValue
方法,给LiveData
赋值,每次赋完值后,都会回调onChanged
方法
每次点击按钮都会打印数据,可以在数据更新后进行UI更改
1.4 实体类更新
实体类更新方法相同,就不详细描述了
2 使用MediatorLiveData
上述方法讲的MutableLiveData
对象为单个对象,那么有多个数据监听呢,那么,就可以使用MediatorLiveData
MediatorLiveData
可以合并多个LiveData
源,只要任何原始的LiveData
源对象发生更改,就会触发MediatorLiveData
对象的观察者。
2.1 创建 MediatorLiveData
对象
2.2 创建两个数据源
2.3 添加addSource
方法
调用MediatorLiveData
的addSource
方法,分别将liveData1
和liveData2
加到MediatorLiveData
要监听的数据源中
2.4 观察LiveData对象
不管哪里数据更新,这里都能接收到数据变化,可用于本地更新和网络更新两种状态
6 和viewModel的配合使用
如果多个数据要怎么办,那么就可以使用viewModel结合liveData搭配使用啦,下面示例基本用法,都用基本类型代替
1 创建多个LiveData
写一个自己的Model去继承ViewModel
创建三个数据,分别为Long和String类型,你可以更换成自己的实体类
2 创建 MediatorLiveData
创建MediatorLiveData,并将三个数据添加进去,并定义个获取MediatorLiveData的函数
你也可以定义单个数据的函数
3 在Activity 监听
使用viewModel = ViewModelProvider(this).get(MyViewModel::class.java) 获取viewModle实例,
监听方法相同,就是改成用用viewModel.getLiveData().observe替换liveData.observe,你也可以在viewModel里面写更改数据的函数,然后直接用viewModel调用