可观察性指的是一个对象会在其数据发生变动时向其余类发出通知。可观察性 是数据绑定库 (Data Binding) 的重要特性之一,它能够将数据和 UI 元素绑定在一块儿——当数据发生变化时,屏幕上的相关元素也会随之更新。android
默认状况 下,普通函数和字符串是不可观察的,这就意味着,当您在数据绑定布局中须要使用它们时,只能在新建的时候获取它们的值,但在后续的操做中,却不能获得相应的数据。架构
为了使对象可观察,数据绑定库 中包含了一系列可观察的类,如: ObservableBoolean、ObservableInt、ObservableDouble… 和一些通用类、ObservableField<T>。这里咱们将其统称为 “Observable Fields”。app
再后来,在咱们发布 Android 架构组件 时首批就包含了 LiveData ,这是另外一个 “可观察” 类,而且与数据绑定库兼容。ide
LiveData 能够感知生命周期,这一点与 Observable Fields 相比并无多大优点,由于 Data Binding 本来就能够检查视图活跃状况。所以对于 LiveData 来讲,它的优点在于不只支持 Transformations,并且能够与许多架构组件 (如 Room、WorkManager) 相互配合使用。函数
综上,咱们推荐您使用 LiveData 。方法也很是简单,只须要两个步骤。布局
若是您是直接在数据绑定中使用 Observable Fields,只需将 Live ObservableSomething (或ObservableField <Something>) 替换为 LiveData <Something> 便可。this
替换前:google
<data> <import type="android.databinding.ObservableField"/> <variable name="name" type="ObservableField<String>" /> </data> … <TextView android:text="@{name}" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
注意: “<” 不是错误,而是您必须对此处的 “<” 符号进行转义。spa
替换后:code
<data> <import type="android.arch.lifecycle.LiveData" /> <variable name="name" type="LiveData<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 }
视图的绑定类中包含一个 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 相关的更多信息。