兩步使用 LiveData 替換 Observable Field

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

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

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

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

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

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

第一步: 用 LiveData 替換 Observable Fields

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

替換前:google

<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"/>

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

替換後:code

<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 對象能夠與 TransformationsMediatorLiveData 配合使用,完成數據轉換。

咱們也在 2019 年的 Android Dev Summit 上發佈了一個與 LiveData 相關的視頻,能夠查看這個視頻獲取 LiveData 相關的更多信息。

相關文章
相關標籤/搜索