【发布时间】: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