Android LiveData

更新日期: 2022-10-29 阅读次数: 3684 字数: 584 分类: Android

可以包含任何类型的数据,通过监听 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!")
}

tags: LiveData

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式