LiveData与ObservableField进行数据绑定

时间:2018-12-18 15:38:33

标签: android binding observable android-livedata

关于Stackoverflow,有多个问题与LiveData和ObservableField之间的差异有关。另外,我在互联网上找到了有关该主题的多篇文章。所有这些都说明LiveData与ObservableField不同,它具有生命周期意识。他们中的大多数人还提到,如果像Activity或Fragment这样的组件观察到该属性,则使用LiveData代替ObservableField是有利的,因此我们不需要取消订阅。

但是,即使阅读了所有这些内容之后,我仍然不清楚的是,使用LiveData而不是ObservableField进行数据绑定有什么优势。例如:

ViewModel:

class UserViewModel(user: User) : ViewModel {
    val userName = ObservableField<String>(user.name) // Option 1
    val userName = MutableLiveData<String>(user.name) // Option 2
}

布局:

<layout>
    <data>
        <variable name="viewModel" type="com.example.UserViewModel" />
    </data>
    ...
</layout>

对于选项2,我当然也必须使用binding.setLifecycleOwner(activity)。让我们假设除布局外没有其他userName

我的问题是:

使用选项2相对于选项1是否有任何优势,或者在这种情况下没有关系,因为视图(布局)将一直观察到它存在为止?

让我更困惑的是这篇文章: https://android.jlelse.eu/android-architecture-components-livedata-with-data-binding-7bf85871bbd8 其中说: “在以前的方法(没有LiveData)中,如果我们想在UI上显示数据,则应该事先检查它是否仍然存在。使用LiveData,我们不必担心它,因为只有在以下情况下才发布数据活动至少已开始(因此处于开始或恢复状态)。“

我不明白这个引用的部分。在使用ObservableField的“先前方法”的情况下,检查UI是否仍然存在是什么意思?您如何在选项1中将此检查应用于我的示例?

1 个答案:

答案 0 :(得分:1)

当您使用ObservableField并聆听其更改时,在两种情况下都会收到通知:

  1. 用户可见活动。
  2. 当活动不可见时(处于暂停或销毁状态)。

现在,当您收到有关此类事件的通知并且您需要更改UI(例如textView等)时,情况1可以正常运行,因为该活动可见,但是在情况2中,不建议更改UI,因为该活动不可见,并且如果视图不存在,可能会崩溃(例如完成活动的状态)。

因此,为避免这种情况2崩溃,并且像Live data一样发生Live data不必要的数据更改,只有在可见活动时,您才会获得更改事件。实时数据观察者根据活动/片段的生命周期工作。 因此,您无需在UI更新之前检查视图是否存在,因为它本身不会调用观察者。