LiveData与ObservableField的数据绑定



关于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

我的问题是:

与选项1相比,使用选项2有什么好处吗?或者在这种情况下无关紧要,因为视图(布局(只会观察到它的存在?

更让我困惑的是这篇文章:https://android.jlelse.eu/android-architecture-components-livedata-with-data-binding-7bf85871bbd8上面写着:"在以前的方法中(没有LiveData(,如果我们想在UI上显示数据,我们应该先检查它是否仍然存在。有了LiveData,我们不需要担心它,因为只有当活动至少启动(因此处于启动或恢复状态(时,数据才会发布。">

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

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

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

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

因此,为了避免这种情况2崩溃和不必要的数据更改,Live data将发挥作用,就像在Live data中一样,只有当活动可见时,您才会获得更改事件。实时数据观察员根据活动/片段的生命周期工作。因此,您不需要在UI更新之前检查视图是否存在,因为它本身并没有被调用。

最新更新