MVVM中的MediatorLiveData和MutableLiveData有什么区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MVVM中的MediatorLiveData和MutableLiveData有什么区别相关的知识,希望对你有一定的参考价值。
我搜索了很多但没有找到问题的清晰答案:
- MediatorLiveData和MutableLiveData有什么区别?
- 使用其中任何一种的合适条件是什么。
首先,我们需要知道MutableLivedata和MediatorLivedata之间的关系,以了解它们之间的区别。
java.lang.Object
↳ android.arch.lifecycle.LiveData<T>
↳ android.arch.lifecycle.MutableLiveData<T>
↳ android.arch.lifecycle.MediatorLiveData<T>
现在很清楚,MediatorLiveData是MutableLiveData的子类,因此MediatorLiveData可以访问MutableLiveData和LiveData的每个属性。
问题没有。部分回答1,其余部分将在问题编号的末尾讨论。 2的答案。
在研究了一些示例项目以及android开发人员的官方网站后,我发现MutableLiveData仅用于在观察任何数据时通知您的UI。
例如,您希望在两个不同的片段(Fragment1和Fragment2)上显示两个SeekBars,并且还希望在从Fragment1操作时同步它们。
另一种情况是我们有2个LiveData实例,我们将它们命名为liveData1和liveData2,我们希望将它们的排放合并到一个对象中:liveDataMerger(它是一个MediatorLiveData对象)。然后,liveData1和liveData2将成为liveDataMerger的源,每次为其中任何一个调用onChanged回调时,我们在liveDataMerger中设置一个新值。
LiveData liveData1 = ...;
LiveData liveData2 = ...;
MediatorLiveData liveDataMerger = new MediatorLiveData<>();
liveDataMerger.addSource(liveData1, value ->liveDataMerger.setValue(value));
liveDataMerger.addSource(liveData2, value -> liveDataMerger.setValue(value));
在这种情况下,您不能使用MutableLiveData,但另一方面,如果您想将数据比较到第一个示例(使用MutableLiveData),那么您不能,因为您将无法使用addSource属性(根据类层次结构)。
qazxsw poi是qazxsw poi的子类,它暴露了set Value和postValue方法(第二个是线程安全的),因此您可以将值分配给任何活动的观察者。
MutableLiveData可以观察其他LiveData对象(源)并对其onChange事件作出反应,这将使您可以控制何时传播事件或特别执行某些操作。
看一下以下谷歌的例子:
让我们考虑一下,我们只希望liveData1发出的10个值合并到liveDataMerger中。然后,在10个值之后,我们可以停止监听liveData1并将其作为源删除。
LiveData
MediatorLiveData是MutableLiveData的子类,可以观察其他LiveData对象并对它们的OnChanged事件做出反应。
例如,如果UI中有可以从本地数据库或网络更新的LiveData对象,则可以将以下源添加到MediatorLiveData对象:与数据库中存储的数据关联的LiveData对象。与从网络访问的数据关联的LiveData对象。您的活动只需要观察MediatorLiveData对象以从两个源接收更新。
MediatorLiveData提供添加和删除源的方法 -
- addSource(LiveData源,Observer onChanged)
- 删除源(实时数据到远程)
例如,查看官方文档 - MediatorLiveData
关于LiveData的一个很好的阅读,请点击这里 - liveDataMerger.addSource(liveData1, new Observer() {
private int count = 1;
@Override public void onChanged(@Nullable Integer s) {
count++;
liveDataMerger.setValue(s);
if (count > 10) {
liveDataMerger.removeSource(liveData1);
}
}
});
https://developer.android.com/reference/android/arch/lifecycle/MediatorLiveData持有一个https://medium.com/@elye.project/understanding-live-data-made-simple-a820fcd7b4d0物体来处理某些情况。例如:您可能需要处理一些systemService,例如LocationManager,Resource。你可以通过MediatorLiveData
提供application
。 dataEvent
没有像MediatorLiveData
这样的成员。
以上是关于MVVM中的MediatorLiveData和MutableLiveData有什么区别的主要内容,如果未能解决你的问题,请参考以下文章
使用 MediatorLiveData 时出现 NullPointerException
数据绑定 - MediatorLiveData 未在 Fragment 内触发
具有多个参数的 MediatorLiveData 或 switchMap 转换