关于android:两步使用-LiveData-替换-Observable-Field

47次阅读

共计 2161 个字符,预计需要花费 6 分钟才能阅读完成。

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

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

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

再起初,在咱们公布 Android 架构组件 时首批就蕴含了 LiveData,这是另一个“可察看”类,并且与数据绑定库兼容。

LiveData 能够感知生命周期,这一点与 Observable Fields 相比并没有多大劣势,因为 Data Binding 本来就能够查看视图沉闷状况。因而对于 LiveData 来说,它的劣势在于不仅反对 Transformations,而且能够与许多架构组件 (如 Room、WorkManager) 相互配合应用。

综上,咱们举荐您应用 LiveData。办法也非常简单,只须要两个步骤。

第一步: 用 LiveData 替换 Observable Fields

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

替换前:

<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 对象能够与 Transformations 或 MediatorLiveData 配合应用,实现数据转换。

咱们也在 2019 年的 Android Dev Summit 上公布了一个与 LiveData 相干的视频,能够查看这个视频获取 LiveData 相干的更多信息。

正文完
 0