默認狀況下,普通函數和字符串是不可觀察的,這就意味着,當您在數據綁定佈局中須要使用它們時,只能在新建的時候獲取它們的值,但在後續的操做中,卻不能獲得相應的數據。html
爲了使對象可觀察,數據綁定庫中包含了一系列可觀察的類,如: ObservableBoolean、ObservableInt、ObservableDouble… 和一些通用類、ObservableField。這裏咱們將其統稱爲 「Observable Fields」。android
再後來,在咱們發佈 Android 架構組件時首批就包含了 LiveData,這是另外一個 「可觀察」 類,而且與數據綁定庫兼容。bash
LiveData 能夠感知生命週期,這一點與 Observable Fields 相比並無多大優點,由於 Data Binding 本來就能夠檢查視圖活躍狀況。所以對於 LiveData 來講,它的優點在於不只支持 Transformations,並且能夠與許多架構組件 (如 Room、 WorkManager) 相互配合使用。架構
綜上,咱們推薦您使用 LiveData。方法也很是簡單,只須要兩個步驟。app
若是您是直接在數據綁定中使用 Observable Fields,只需將 Live ObservableSomething (或ObservableField < Something >) 替換爲 LiveData < Something > 便可。ide
替換前:函數
<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"/>
複製代碼
注意: /</ 不是錯誤,而是您必須對此處的 「<」 符號進行轉義。佈局
替換後:ui
<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 便可。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
}
複製代碼
視圖的綁定類中包含一個 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 相關的視頻,以下:
騰訊視頻連接:
Bilibili 視頻連接:
點擊這裏瞭解更多 LiveData 使用指南