两步使用 LiveData 替换 Observable Field

两步使用 LiveData 替换 Observable Field

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

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

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

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

LiveData 可以感知生命周期,这一点与 Observable Fields 相比并没有多大优势,因为 Data Binding 原本就可以检查视图活跃情况。因此对于 LiveData 来说,它的优势在于不仅支持 Transformations,而且可以与许多架构组件 (如 RoomWorkManager) 相互配合使用。

综上,我们推荐您使用 LiveData 。方法也非常简单,只需要两个步骤。

第一步: 用 LiveData 替换 Observable Fields

如果您是直接在数据绑定中使用 Observable Fields,只需将 Live ObservableSomething (或ObservableField ) 替换为 LiveData 即可。

替换前:

<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"/>

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

替换后:

<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 即可。

替换前:

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 对象可以与 TransformationsMediatorLiveData 配合使用,完成数据转换。

我们也在 2019 年的 Android Dev Summit 上发布了一个与 LiveData 相关的视频,可以查看这个视频获取 LiveData 相关的更多信息。

版权声明

禁止一切形式的转载-禁止商用-禁止衍生 申请授权

脉脉不得语
脉脉不得语
Zhengzhou Website
Android Developer | https://androiddevtools.cn and https://androidweekly.io Funder | GDG Zhengzhou Funder & Ex Organizer | http://Toast.show(∞) Podcast Host

你已经成功订阅到 Android 开发技术周报
太棒了!接下来,完成检验以获得全部访问权限 Android 开发技术周报
欢迎回来!你已经成功登录了。
Unable to sign you in. Please try again.
成功!您的帐户已完全激活,您现在可以访问所有内容。
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.
🍗