【问题标题】:LiveData vs. ObservableField for data binding用于数据绑定的 LiveData 与 ObservableField
【发布时间】:2018-12-18 15:38:32
【问题描述】:

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

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

视图模型:

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 中的示例应用此检查?

【问题讨论】:

  • 您找到解决方案了吗?如果是,请分享您的想法。
  • 我也很好奇这个。我没有答案,但在 post on the Android Developers blog 中找到了这句话:“LiveData 是生命周期感知的,但这对于可观察字段而言并不是一个巨大的优势,因为数据绑定已经检查了视图何时处于活动状态。”作者提到了想要改变的其他原因,但我看到没有任何东西不是 Rx 解决的。那么,在这种情况下,还有什么优势吗?

标签: android binding observable android-livedata


【解决方案1】:

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

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

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

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

【讨论】:

  • 数据绑定会发生#2 吗?文档似乎建议数据库将确保在视图不存在时不会发生更新,但是,我承认我没有看到在生成的代码或数据库库中发生这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多