android - 用于数据绑定(bind)的 LiveData 与 ObservableField

标签 android binding observable android-livedata

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

然而,即使阅读了所有这些内容,我仍然不清楚使用 LiveData 进行数据绑定(bind)是否优于 ObservableField。例如:

View 模型:

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 有任何优势,或者在这种情况下无关紧要,因为 View (布局)将简单地观察直到它存在?

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

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

最佳答案

当您使用 ObservableField 并监听它的变化时,您会在这两种情况下收到通知:

  1. 当 Activity 对用户可见时。
  2. 当 Activity 不可见时(处于暂停或破坏状态)。

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

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

关于android - 用于数据绑定(bind)的 LiveData 与 ObservableField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53836429/

相关文章:

android - 获取 cordova ionic 应用程序的 Firebase 事件参数

java - Android Things 和 Adafruit Ultimate GPS Breakout v3

wpf - 在自定义控件中使用 DataContext

angular - 从 Angular 2 中的模型获取可观察值

javascript - 使用 rxJS 观察 dom 元素的大小调整

Angular 4,将http响应可观察到对象可观察

android - 服务启动,然后崩溃

android - RecyclerView 网格布局管理器 : span count is defaulted to 1

c# - 将文本框绑定(bind)到字典

WPF 绑定(bind)到对象