LiveData与ObservableField进行数据绑定

1da*_*on1 8 binding android 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
}
Run Code Online (Sandbox Code Playgroud)

布局:

<layout>
    <data>
        <variable name="viewModel" type="com.example.UserViewModel" />
    </data>
    ...
</layout>
Run Code Online (Sandbox Code Playgroud)

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

我的问题是:

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

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

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

sak*_*ham 8

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

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

现在,当您收到此类事件的通知并且您需要更改诸如 textView 等 UI 时,案例 1 将正常工作,因为该活动可见,但在案例 2 中,不建议更改 UI,因为该活动不可见,并且如果活动不可见,也可能会崩溃视图不存在(就像完成活动的状态)。

所以这里为了避免这种情况 2 崩溃和不需要的数据更改Live data开始发挥作用,因为Live data只有在活动可见时您才会收到更改事件。实时数据观察者根据 Activity/Fragment 的生命周期工作。所以你不需要在 UI 更新之前检查视图是否存在,因为它本身没有调用观察者。

  • 数据绑定会发生#2 吗?文档似乎表明数据库将确保当视图不活动时不会发生更新,但是,我承认我没有在生成的代码或数据库库中看到这种情况发生的地方。 (3认同)