本文已参与「新人创作礼」活动,一起开启掘金创作之路。
LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 activity、fragment 或 service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
1.使用 LiveData 的优势
使用 LiveData 具有以下优势:
-
确保界面符合数据状态
LiveData 遵循观察者模式。当底层数据发生变化时,LiveData 会通知
Observer对象。您可以整合代码以在这些Observer对象中更新界面。这样一来,您无需在每次应用数据发生变化时更新界面,因为观察者会替您完成更新。 -
不会发生内存泄漏
观察者会绑定到
Lifecycle对象,并在其关联的生命周期遭到销毁后进行自我清理。 -
不会因 Activity 停止而导致崩溃
如果观察者的生命周期处于非活跃状态(如返回堆栈中的 activity),它便不会接收任何 LiveData 事件。
-
不再需要手动处理生命周期
界面组件只是观察相关数据,不会停止或恢复观察。LiveData 将自动管理所有这些操作,因为它在观察时可以感知相关的生命周期状态变化。
-
数据始终保持最新状态
如果生命周期变为非活跃状态,它会在再次变为活跃状态时接收最新的数据。例如,曾经在后台的 Activity 会在返回前台后立即接收最新的数据。
-
适当的配置更改
如果由于配置更改(如设备旋转)而重新创建了 activity 或 fragment,它会立即接收最新的可用数据。
2.使用 LiveData 对象
创建 LiveData 对象
LiveData 是一种可用于任何数据的封装容器,其中包括可实现 Collections 的对象,如 List。LiveData 对象通常存储在 ViewModel 对象中,并可通过 getter 方法进行访问,如以下示例中所示:
class NameViewModel : ViewModel() {
val currentName: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
}
注意:请确保用于更新界面的 LiveData 对象存储在 ViewModel 对象中,而不是将其存储在 activity 或 fragment 中,原因如下:
- 避免 Activity 和 Fragment 过于庞大。现在,这些界面控制器负责显示数据,但不负责存储数据状态。
- 将
LiveData实例与特定的 Activity 或 Fragment 实例分离开,并使LiveData对象在配置更改后继续存在。
设置 LiveData 对象观察对象
class NameActivity : AppCompatActivity() {
private val model: NameViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//这里定义了一个观察者,当被观察数据发生变化的时候,就会通知观察者,进而改变UI
val nameObserver = Observer<String> { newName ->
nameTextView.text = newName
}
//这个实际上就是把当前观察者添加进去
model.currentName.observe(this, nameObserver)
}
}
如果对观察者对象了解的同学们就知道,观察者设计模型有三个关键步骤 1、创建被观察对象 2、创建观察者 3、连接观察者和被观察者
更新 LiveData 对象
button.setOnClickListener {
val anotherName = "John Doe"
model.currentName.setValue(anotherName)
}
这个是在主线程中使用,在子线程中使用这个需要使用另外一个接口进行调用