可以包含任何类型的数据,通过监听 LiveData,在数据发生变化时,可以立即得到通知。
LiveData 与 ViewModel
通常 LiveData 定义在 ViewModel 中,然后在 Activity / Fragment 中监听 LiveData 的变化。
不在 Activity 中定义 LiveData,原因有两点:
- 防止 Activity / Fragment 过于臃肿。要分工明确:Activity / Fragment 只负责显示数据;ViewModel 负责存储数据及状态。
- 防止 Activity 因屏幕旋转被销毁,状态数据消失。而存在 ViewModel 中就能很好的规避这一点。
为何是监听这种方式
当 ViewModel 中的数据发生变化,要同步到 Activity / Fragment 上有两种方式:
- (推荐)在 Activity / Fragment 中监听 ViewModel 中 LiveData 的变化
- (不推荐)在 ViewModel 中直接操作 Activity / Fragment。不推荐的原因是,ViewModel 的生命周期是长于 Activity 的,因为屏幕旋转情况下,Activity 会被销毁重建,而 ViewModel 则一直存活。导致 Activity 内存无法释放,造成内存泄漏。
LiveData 与 MutableLiveData 的区别
一开始看到 MutableLiveData 这个类型的时候,我非常疑惑。 既然 LiveData 是用来监听数据变化的,那么这个类型一定是可以更改的啊,不能变化还有监听的必要么?
实际上,LiveData 与 MutableLiveData 的区别并不是是否可以更改,而是在哪里可以更改:
- LiveData 只能在 ViewModel 中更改。要实现其可以被修改,可以通过 get 方法指向一个 ViewModel 中私有的 MutableLiveData 属性。
- MutableLiveData 可以在 ViewModel 外,进行修改。即调用 setValue(),postValue()。
所以,为了偷懒起见,不去考虑使用场景,我直接用 MutableLiveData 就对了。
但是,有一种所谓推荐的做法,也完美诠释了两种的区别:
- 内部同时存在两个变量,一个是公共类型 LiveData,另一个是私有类型 MutableLiveData
- ViewModel 对外只暴露 LiveData 类型,及相关操作函数。而其 get 指向另一个 MutableLiveData
- ViewModel 外部,通过封装好的函数,修改 MutableLiveData
setValue 与 postValue 的区别
- setValue 只能在 UI 主线程中调用
- postValue 只能在非主线程中调用
监听变化并刷新界面 UI
界面操作更新 LiveData
button.setOnClickListener {
viewModel.currentMode.setValue("Some new value!")
}
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式