概述
LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。 —官方解释
https://developer.android.google.cn/topic/libraries/architecture/livedata?hl=zh_cn#kotlin
LiveData 的部分特性如下:
LiveData 可存储数据;LiveData 是一种可存储任何类型的数据的封装容器。
LiveData 是可观察的,这意味着当 LiveData 对象存储的数据发生更改时,观察器会收到通知。
LiveData 具有生命周期感知能力。当您将观察器附加到 LiveData 后,观察器就会与 LifecycleOwner(通常是 activity 或 fragment)相关联。LiveData 仅更新处于活跃生命周期状态(例如 STARTED 或 RESUMED)的观察器。您可以在此处详细了解 LiveData 和观察。
优势
- 确保界面符合数据状态
LiveData 遵循观察者模式。当底层数据发生变化时,LiveData 会通知 Observer 对象。您可以整合代码以在这些 Observer 对象中更新界面。这样一来,您无需在每次应用数据发生变化时更新界面,因为观察者会替您完成更新。 - 不会发生内存泄漏
观察者会绑定到 Lifecycle 对象,并在其关联的生命周期遭到销毁后进行自我清理。 - 不会因 Activity 停止而导致崩溃
如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件。 - 不再需要手动处理生命周期
界面组件只是观察相关数据,不会停止或恢复观察。LiveData 将自动管理所有这些操作,因为它在观察时可以感知相关的生命周期状态变化。 - 数据始终保持最新状态
如果生命周期变为非活跃状态,它会在再次变为活跃状态时接收最新的数据。例如,曾经在后台的 Activity 会在返回前台后立即接收最新的数据。 - 适当的配置更改
如果由于配置更改(如设备旋转)而重新创建了 Activity 或 Fragment,它会立即接收最新的可用数据。 - 共享资源
您可以使用单例模式扩展 LiveData 对象以封装系统服务,以便在应用中共享它们。LiveData 对象连接到系统服务一次,然后需要相应资源的任何观察者只需观察 LiveData 对象。
使用步骤
- 创建存储某种类型的LiveData
- 创建可观察数据改变的Observer对象
- 使用LiveData的observe()方法,将Observer对象附加上
- 更新 LiveData 对象,Observer监听到,更新UI
通过以上几步就实现了对数据的更新。
创建存储某种类型的LiveData
通过现在流行的MVVM架构,我们知道LiveData的创建,一般是在ViewModel里面完成的。
class NameViewModel : ViewModel() {
val currentName: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
}
创建可观察数据改变的Observer对象
class NameActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 创建Observer对象,监听LiveData数据变化,通过他来更新UI
val nameObserver = Observer<String> { newName ->
// Update the UI, in this case, a TextView.
nameTextView.text = newName
}
}
使用LiveData的observe()方法,将Observer对象附加上
class NameActivity : AppCompatActivity() {
private val model: NameViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 创建Observer对象,监听LiveData数据变化,通过他来更新UI
val nameObserver = Observer<String> { newName ->
// Update the UI, in this case, a TextView.
nameTextView.text = newName
}
// 把Observer对象附加在LiveData,以观察到数据变化
model.currentName.observe(this, nameObserver)
}
}
更新 LiveData
我们通过点击按钮,来改变LiveData内部的数据。
这样,Observer监听到就会更新UI。
button.setOnClickListener {
val anotherName = "John Doe"
model.currentName.setValue(anotherName)
}
在本示例中调用 setValue(T) 导致观察者使用值 John Doe 调用其 onChanged() 方法。本示例中演示的是按下按钮的方法,但也可以出于各种各样的原因调用 setValue() 或 postValue() 来更新 mName,这些原因包括响应网络请求或数据库加载完成。在所有情况下,调用 setValue() 或 postValue() 都会触发观察者并更新界面。
注意:您必须调用 setValue(T) 方法以从主线程更新 LiveData 对象。如果在工作器线程中执行代码,您可以改用 postValue(T) 方法来更新 LiveData 对象。
记:数据倒灌问题。
最后
以上就是爱笑花瓣为你收集整理的Android Jetpack---LiveData简单使用的全部内容,希望文章能够帮你解决Android Jetpack---LiveData简单使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复