两步使用 LiveData 替换 Observable Field

可观察性指的是一个对象会在其数据发生变动时向其余类发出通知。 可观察性是数据绑定库 (Data Binding) 的重要特性之一,它能够将数据和 UI 元素绑定在一块儿——当数据发生变化时,屏幕上的相关元素也会随之更新。

默认状况下,普通函数和字符串是不可观察的,这就意味着,当您在数据绑定布局中须要使用它们时,只能在新建的时候获取它们的值,但在后续的操做中,却不能获得相应的数据。html

为了使对象可观察,数据绑定库中包含了一系列可观察的类,如: ObservableBoolean、ObservableInt、ObservableDouble… 和一些通用类、ObservableField。这里咱们将其统称为 “Observable Fields”。android

再后来,在咱们发布 Android 架构组件时首批就包含了 LiveData,这是另外一个 “可观察” 类,而且与数据绑定库兼容。bash

LiveData 能够感知生命周期,这一点与 Observable Fields 相比并无多大优点,由于 Data Binding 本来就能够检查视图活跃状况。所以对于 LiveData 来讲,它的优点在于不只支持 Transformations并且能够与许多架构组件 (如 RoomWorkManager) 相互配合使用架构

综上,咱们推荐您使用 LiveData。方法也很是简单,只须要两个步骤。app

第一步: 用 LiveData 替换 Observable Fields

若是您是直接在数据绑定中使用 Observable Fields,只需将 Live ObservableSomething (或ObservableField < Something >) 替换为 LiveData < Something > 便可。ide

替换前:函数

<data>
    <import type="android.databinding.ObservableField"/>
    <variable 
        name="name" 
        type="ObservableField&lt;String>" />
</data>
…
<TextView
    android:text="@{name}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
复制代码

注意: /&lt/ 不是错误,而是您必须对此处的 “<” 符号进行转义。布局

替换后:ui

<data>
        <import type="android.arch.lifecycle.LiveData" />
        <variable
            name="name"
            type="LiveData&lt;String>" />
</data>
…
<TextView
    android:text="@{name}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
复制代码

或者,若是您是经过 ViewModel、Presenter 或 Controller 暴露可观察对象的话,则无需更改布局,只要用 ViewModel 中的 LiveData 替换这些 ObservableFields 便可。this

替换前:

class MyViewModel : ViewModel() {
    val name = ObservableField<String>("Ada")
}
复制代码

替换后:

class MyViewModel : ViewModel() {
    private val _name = MutableLiveData<String>().apply { value = "Ada" }

    val name: LiveData<String> = _name // Expose the immutable version of the LiveData
}
复制代码

第二步: 设置 LiveData 的生命周期全部者

视图的绑定类中包含一个 setLifecycleOwner 方法,想要从数据绑定布局观察 LiveData ,必须使用该方法。

替换前:

val binding = DataBindingUtil.setContentView<TheGeneratedBinding>(
    this,
    R.layout.activity_data_binding
)

binding.name = myLiveData // or myViewModel

复制代码

替换后:

val binding = DataBindingUtil.setContentView<TheGeneratedBinding>(
    this,
    R.layout.activity_data_binding
)

binding.lifecycleOwner = this // Use viewLifecycleOwner for fragments

binding.name = myLiveData // or myViewModel
复制代码

小提示: 若是要设置 fragment 的内容,建议使用 fragment.viewLifecycleOwner (而不是 fragment 的生命周期) 来处理潜在的分离 fragment。

如今,LiveData 对象能够与 Transformations MediatorLiveData 配合使用,完成数据转换。

咱们也在 2019 年的 Android Dev Summit 上发布了一个与 LiveData 相关的视频,以下:

腾讯视频连接:

v.qq.com/x/page/a302…

Bilibili 视频连接:

www.bilibili.com/video/BV1PJ…

点击这里了解更多 LiveData 使用指南

相关文章
相关标签/搜索