LiveData是Jetpack提供的一种响应式编程组件,它可以包含任何类型的数据,并在数据发生变化的时候通知给观察者。
LiveData通常与ViewModel结合在一起使用, 我们可以回到 初识Kotlin 之2__探究Jetpack 再回顾思维导图。
一 LiveData的基本用法
在之前,我们一直在Activity中手动获取ViewModel 中的数据, 但是ViewModel却无法将数据的变化主动通知给Activity.
那么能否这样思考? 把Activity 的实例传给ViewModel, 这样ViewModel不就能主动对Activity通知了吗?
不能这样做!
因为ViewModel的生命周期是长于Activity 的, 如果把Activity 的实例传给ViewModel, 可能会因为Activity 无法释放而造成内存泄漏。
要解决这个问题,就是使用LiveData, 即: 将变化的数据用LiveData来包装, 然后在Activity 中去观察它, 就可以主动将数据变化通知给Activity了。
在上篇博文基础上, 修改MainViewModel中的代码,如下所示:

这里我们将 counter 变量修改成一个MutableLiveData 对象, 并指定它的泛型为Int, 表示它包含的是整型数据。 MutableLiveData是一种可变的LiveData, 它的用法很简单, 主要有3种读写数据的方法, 分别是getValue()、 setValue()、postValue()方法。
- getValue() 方法用于获取LiveData中包含的数据;
- setValue() 方法用于给LiveData设置数据, 但是只能在主线程中调用;
- postValue()用于在非主线程中给LiveData设置数据。
可以看到, 这里在init {} 给counter设置数据, 这样之前保存的计数值就可以在初始化的时候得到恢复。
plusOne() 方法中的逻辑是先获得counter中包含的数据, 然后给它加1, 再重新设置到counter中,注意调用LiveData的getValue() 方法所获得的数据可能为空,
因此这里使用了一个?:操作符, 当获取到的数据为空时, 就用0来作为默认计数。
使用LiveData进行响应式编程:与ViewModel的完美结合

本文介绍了Android Jetpack组件LiveData的基本用法,它允许在数据变化时自动通知观察者。LiveData通常与ViewModel一起使用,避免了因将Activity实例传给ViewModel可能导致的内存泄漏问题。通过创建MutableLiveData对象并使用setValue()和postValue()方法更新数据,ViewModel可以在后台线程中改变数据并通知到Activity。此外,还讨论了在恢复计数器值时的注意事项,如使用getValue()可能返回空值的情况。
158

被折叠的 条评论
为什么被折叠?



