可觀察性指的是一個對象會在其數據發生變動時向其餘類發出通知。可觀察性 是數據綁定庫 (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 相關的更多信息。