我搜索了很多,但没有找到问题的清晰答案:
MediatorLiveData和MutableLiveData有什么区别?
使用其中任何一种的合适条件。
答案 0 :(得分:19)
首先,我们需要知道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属性(根据类层次结构) )。
答案 1 :(得分:17)
MutableLiveData是LiveData的子类,它暴露了setValue和postValue方法(第二个是线程安全的),因此您可以将值分派给任何活动的观察者。
MediatorLiveData可以观察其他LiveData对象(来源)并对其onChange事件作出反应,这将使您可以控制何时传播事件,或者特别做某事。
看一下以下谷歌的例子:
让我们考虑一下,我们只需要liveData1发出的10个值 在liveDataMerger中合并。然后,在10个值之后,我们可以停止 收听liveData1并将其作为源删除。
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); } } });
答案 2 :(得分:0)
MediatorLiveData 是 MutableLiveData 的子类,可以观察其他LiveData对象并对其中的OnChanged事件做出反应。
例如,如果您的UI中有一个LiveData对象,可以从本地数据库或网络更新该对象,则可以将以下源添加到MediatorLiveData对象: 与数据库中存储的数据关联的LiveData对象。 与从网络访问的数据关联的LiveData对象。 您的活动只需观察MediatorLiveData对象即可从两个来源接收更新。
MediatorLiveData 提供了添加和删除源的方法-
例如,在此处查看官方文档-https://developer.android.com/reference/android/arch/lifecycle/MediatorLiveData
关于LiveData的很好的阅读,请点击此处-https://medium.com/@elye.project/understanding-live-data-made-simple-a820fcd7b4d0
答案 3 :(得分:0)
MediatorLiveData<String> mediatorLiveData = new MediatorLiveData<String>();
public MutableLiveData<String> liveData1 = new MutableLiveData<String>();
public MutableLiveData<String> liveData2 = new MutableLiveData<String>();
mediatorLiveData.addSource(liveData1,
new Observer<String>() {
@Override
public void onChanged(String s) {
mediatorLiveData.setValue(s + " - emission from observer of liveData1");
}
}
);
mediatorLiveData.addSource(liveData2,
new Observer<String>() {
@Override
public void onChanged(String s) {
mediatorLiveData.setValue(s + " - emission from observer of liveData2");
}
}
)
mediatorLiveData.observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
Toast.makeText(context, s , Toast.LENGTH_SHORT).show();
}
});
liveData1.postValue("hello") // output : hello - emission from observer of liveData1
liveData2.postValue("world") // output : world - emission from observer of liveData2
您可以使用mediatorLiveData的addSource()方法将2个liveData添加到mediatorLiveData中。 addSource()方法的定义如下:
addSource(LiveData<S> source, Observer<S> onChanged)
onChanged观察者将在更改源值时被调用。在此观察器中,您可以将值发射到mediatorLiveData中(可以调用setValue(),postValue()方法)。这样,您就有1个mediatorLiveData侦听2个liveData。当liveData1或liveData2中的数据更改时,将调用mediatorLiveData的观察者!为什么?因为您在MediatorLiveData的addSource()方法的第二个参数中将发射排放到mediatorLiveData中。
答案 4 :(得分:-4)
MediatorLiveData
持有application
对象来处理某些情况。例如:您可能需要处理一些systemService,例如LocationManager,Resource。您可以通过dataEvent
投放MediatorLiveData
。
MutableLiveData
没有MediatorLiveData
之类的任何成员。