什么时候使用Android的LiveData和Observable字段?

时间:2018-09-18 21:30:45

标签: android mvvm android-databinding android-livedata

我正在实现MVVM和数据绑定,并且试图了解何时应该在LiveData上使用Observable字段?

我已经遍历了不同的文档,发现LiveData是生命周期感知的,但是在Github的示例代码中,这两个代码同时在ViewModel中使用。因此,如果LiveData优于Observable字段,我会感到困惑,为什么不只使用LiveData?

3 个答案:

答案 0 :(得分:3)

两个都有用例,例如:

  • 如果您希望UI状态模型具有生命周期容忍的容器,那么答案是LiveData

  • 如果要在视图模型中的逻辑发生更改时使UI更新,请使用ObservableFields

我本人更喜欢使用LivaDataObservableField/BaseObservable的组合,LiveData通常将充当生命周期感知数据容器,并充当VM和View之间的通道。

另一方面,通过LiveData发出的UI状态模型对象本身就是BaseObservable或其字段为ObservableField

这样,我可以使用LiveData来更改UI状态。 并每当要更新一小部分UI时,将值设置为UI状态模型ObservableField字段。

编辑: 例如,这是有关UserProfile组件的快速说明:

UIStateModel

data class ProfileUIModel(
    private val _name: String,
    private val _age: Int
): BaseObservable() {
    var name: String
        @Bindable get() = _name
        set(value) {
          _name = value
          notifyPropertyChanged(BR.name)
        }
    var age: Int
        @Bindable get() = _age
        set(value) {
          _age = value
          notifyPropertyChanged(BR.age)
        }
}

ViewModel

class UserProfileViewModel: ViewModel() {

    val profileLiveData: MutableLiveData = MutableLiveData()

    ...

    // When you need to rebind the whole profile UI object.
    profileLiveData.setValue(profileUIModel)

    ...

    // When you need to update a specific part of the UI.
    // This will trigger the notifyPropertyChanged method on the bindable field "age" and hence notify the UI elements that are observing it to update.
    profileLiveData.getValue().age = 20 
}

查看

您将观察LiveData配置文件的正常变化。

XML

您将使用数据绑定来绑定UI状态模型。

答案 1 :(得分:0)

只要要观察LiveData,就可以一直使用LifecycleOwner。我更喜欢将仅与ViewModel相关的绑定字段保留为Observable,对于状态更改也与LiveData或{{1}相关的字段,请使用Activity }。

答案 2 :(得分:0)

LiveData-与LifecycleOwner一起使用,例如活动或片段

可观察-与数据绑定一起使用