兩步使用 LiveData 替換 Observable Field

可觀察性指的是一個對象會在其數據發生變動時向其餘類發出通知。 可觀察性是數據綁定庫 (Data Binding) 的重要特性之一,它能夠將數據和 UI 元素綁定在一塊兒——當數據發生變化時,屏幕上的相關元素也會隨之更新。

默認狀況下,普通函數和字符串是不可觀察的,這就意味着,當您在數據綁定佈局中須要使用它們時,只能在新建的時候獲取它們的值,但在後續的操做中,卻不能獲得相應的數據。html

爲了使對象可觀察,數據綁定庫中包含了一系列可觀察的類,如: ObservableBoolean、ObservableInt、ObservableDouble… 和一些通用類、ObservableField。這裏咱們將其統稱爲 「Observable Fields」。android

再後來,在咱們發佈 Android 架構組件時首批就包含了 LiveData,這是另外一個 「可觀察」 類,而且與數據綁定庫兼容。bash

LiveData 能夠感知生命週期,這一點與 Observable Fields 相比並無多大優點,由於 Data Binding 本來就能夠檢查視圖活躍狀況。所以對於 LiveData 來講,它的優點在於不只支持 Transformations並且能夠與許多架構組件 (如 RoomWorkManager) 相互配合使用架構

綜上,咱們推薦您使用 LiveData。方法也很是簡單,只須要兩個步驟。app

第一步: 用 LiveData 替換 Observable Fields

若是您是直接在數據綁定中使用 Observable Fields,只需將 Live ObservableSomething (或ObservableField < Something >) 替換爲 LiveData < Something > 便可。ide

替換前:函數

<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"/>
複製代碼

注意: /&lt/ 不是錯誤,而是您必須對此處的 「<」 符號進行轉義。佈局

替換後:ui

<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 便可。this

替換前:

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 相關的視頻,以下:

騰訊視頻連接:

v.qq.com/x/page/a302…

Bilibili 視頻連接:

www.bilibili.com/video/BV1PJ…

點擊這裏瞭解更多 LiveData 使用指南

相關文章
相關標籤/搜索