关于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中将此检查应用于我的示例?
答案 0 :(得分:1)
当您使用ObservableField
并聆听其更改时,在两种情况下都会收到通知:
现在,当您收到有关此类事件的通知并且您需要更改UI(例如textView等)时,情况1可以正常运行,因为该活动可见,但是在情况2中,不建议更改UI,因为该活动不可见,并且如果视图不存在,可能会崩溃(例如完成活动的状态)。
因此,为避免这种情况2崩溃,并且像Live data
一样发生Live data
不必要的数据更改,只有在可见活动时,您才会获得更改事件。实时数据观察者根据活动/片段的生命周期工作。
因此,您无需在UI更新之前检查视图是否存在,因为它本身不会调用观察者。