Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 数据绑定的LiveData与ObservableField_Android_Binding_Observable_Android Livedata - Fatal编程技术网

Android 数据绑定的LiveData与ObservableField

Android 数据绑定的LiveData与ObservableField,android,binding,observable,android-livedata,Android,Binding,Observable,Android Livedata,关于Stackoverflow,有许多问题与LiveData和ObservableField之间的差异有关。另外,我在网上找到了多篇关于这个话题的文章。所有这些都解释了LiveData与ObservaleField不同,它具有生命周期意识。大多数人还提到,如果活动或片段等组件观察属性,则使用LiveData而不是ObservaleField是有利的,因此我们不需要取消订阅 然而,即使在阅读了所有这些内容之后,我仍然不清楚的是,使用LiveData进行数据绑定是否比使用ObservaleField

关于Stackoverflow,有许多问题与LiveData和ObservableField之间的差异有关。另外,我在网上找到了多篇关于这个话题的文章。所有这些都解释了LiveData与ObservaleField不同,它具有生命周期意识。大多数人还提到,如果活动或片段等组件观察属性,则使用LiveData而不是ObservaleField是有利的,因此我们不需要取消订阅

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

视图模型:

class UserViewModel(user: User) : ViewModel {
    val userName = ObservableField<String>(user.name) // Option 1
    val userName = MutableLiveData<String>(user.name) // Option 2
}
类UserViewModel(用户:用户):ViewModel{
val userName=observeField(user.name)//选项1
val userName=MutableLiveData(user.name)//选项2
}
布局:

<layout>
    <data>
        <variable name="viewModel" type="com.example.UserViewModel" />
    </data>
    ...
</layout>

...
当然,对于选项2,我还必须使用
binding.setLifecycleOwner(活动)
。让我们假设除了布局之外没有其他内容遵循
用户名

我的问题是:

与选项1相比,使用选项2有什么优势吗?或者,在这种情况下,它无关紧要,因为视图(布局)将只是观察,直到它存在为止

更让我困惑的是这篇文章: 上面说: “在以前的方法中(没有LiveData),如果我们想在UI上显示数据,我们应该事先检查它是否仍然存在。使用LiveData,我们不必担心它,因为只有在活动至少已启动(因此处于已启动或已恢复状态)时才会发布数据。”


我不明白这个引用的部分。如果“以前的方法”使用了
observefield
,那么检查UI是否仍然存在是什么意思?您将如何将此检查应用于选项1中的示例?

当您使用
可观察字段
并收听其更改时,您会收到两种情况下的通知:

  • 当活动对用户可见时
  • 当活动不可见时(处于暂停或销毁状态) 现在,当您收到此类事件的通知并需要更改UI(如textView等)时,案例1将正常工作,因为活动可见,但在案例2中,不建议更改UI,因为活动不可见,并且如果视图不存在(如完成活动的状态),它也可能崩溃

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

    您找到解决方案了吗?如果是,请分享你的想法。我对此也很好奇。我没有答案,但在a中找到了这句话:“LiveData具有生命周期意识,但对于可观察字段而言,这并不是一个巨大的优势,因为数据绑定已经在视图处于活动状态时进行了检查。”作者提到了想要更改的其他原因,但我发现Rx没有解决任何问题。那么,在这种情况下,还有什么优势吗?数据绑定是否会出现#2?文档似乎暗示DB将确保在视图不处于活动状态时不会发生更新,但是,我承认我没有看到在生成的代码或DB库中发生这种情况。