【安卓】两步使用 LiveData 替换 Observable Field

两步使用 LiveData 替换 Observable Field

Android开发者发布于 2020-11-24

【安卓】两步使用 LiveData 替换 Observable Field

可观察性指的是一个对象会在其数据发生变更时向其他类发出通知。可观察性 是数据绑定库 (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 相关的更多信息。

androidjetpack

阅读 183发布于 2020-11-24

本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议


Android 开发者

Android 最新开发技术更新,包括 Kotlin、Android Studio、Jetpack 和 Android 最新系统技术特性分享。

avatar

Android开发者

Android 最新开发技术更新,包括 Kotlin、Android Studio、Jetpack 和 Android 最新系统技术特性分享。

183 声望

550 粉丝

0 条评论

得票时间

avatar

Android开发者

Android 最新开发技术更新,包括 Kotlin、Android Studio、Jetpack 和 Android 最新系统技术特性分享。

183 声望

550 粉丝

宣传栏

【安卓】两步使用 LiveData 替换 Observable Field

可观察性指的是一个对象会在其数据发生变更时向其他类发出通知。可观察性 是数据绑定库 (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 相关的更多信息。

以上是 【安卓】两步使用 LiveData 替换 Observable Field 的全部内容, 来源链接: utcz.com/a/105333.html

回到顶部