
可观察性指的是一个对象会在其数据发生变更时向其他类发出通知。可观察性是数据绑定库 (Data Binding) 的重要特性之一,它可以将数据和 UI 元素绑定在一起——当数据发生变化时,屏幕上的相关元素也会随之更新。
- 数据绑定库https://developer.android.google.cn/topic/libraries/data-binding/
- Android 架构组件https://developer.android.google.cn/topic/libraries/architecture
- LiveDatahttps://developer.android.google.cn/topic/libraries/architecture/livedata
- Transformationshttps://developer.android.google.cn/reference/android/arch/lifecycle/Transformations
- Roomhttps://developer.android.google.cn/topic/libraries/architecture/room
- WorkManagerhttps://developer.android.google.cn/reference/androidx/work/WorkManager
第一步: 用 LiveData 替换 Observable Fields
如果您是直接在数据绑定中使用 Observable Fields,只需将 Live ObservableSomething (或ObservableField <Something>) 替换为 LiveData <Something> 即可。
替换前:
<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"/>
替换后
<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 即可。
- ViewModelhttps://developer.android.google.cn/topic/libraries/architecture/viewmodel
替换前:
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
LiveData
https://developer.android.google.cn/topic/libraries/architecture/livedata
Transformations
https://developer.android.google.cn/reference/android/arch/lifecycle/Transformations
MediatorLiveData
https://developer.android.google.cn/reference/android/arch/lifecycle/MediatorLiveData
我们也在 2019 年的 Android Dev Summit 上发布了一个与 LiveData 相关的视频,如下:
- 腾讯视频链接https://v.qq.com/x/page/a30225h40dj.html
- Bilibili 视频链接https://www.bilibili.com/video/BV1PJ411m7ke/
