Android MVVM中MediatorLiveData和MutableLiveData的区别是什么
我搜索了很多,但没有找到问题的清晰答案:Android MVVM中MediatorLiveData和MutableLiveData的区别是什么,android,android-livedata,android-architecture,Android,Android Livedata,Android Architecture,我搜索了很多,但没有找到问题的清晰答案: MediatorLiveData和MutableLiveData之间有什么区别 使用它们的合适条件是什么 是的子类,它公开了setValue和postValue方法(第二个方法是线程安全的),因此您可以将值分派给任何活动的观察者 可以观察其他LiveData对象(源)并对其onChange事件作出反应,这将使您能够控制何时传播该事件或执行某些特定操作 看看下面谷歌的例子: 让我们考虑我们只需要LIFEDATA1发射的10个值。 在LiveDataMerg
让我们考虑我们只需要LIFEDATA1发射的10个值。 在LiveDataMerge中合并。然后,在10个值之后,我们可以停止 侦听liveData1并将其作为源删除
JAVA 科特林livedatamerge.addSource(liveData1,对象:Observer{
私有变量计数=1
更改后覆盖乐趣(s:Int?){
计数++
livedatamerge.value=s
如果(计数>10){
removeSource(liveData1)
}
}
})
MediatorLiveData
持有应用程序
对象以处理某些条件。您可能需要处理一些系统服务,如LocationManager、Resource。您可以通过MediatorLiveData
交付dataEvent
。
MutableLiveData
没有像MediatorLiveData
那样的成员 首先,我们需要了解它们之间的关系和区别
java.lang.Object
↳ android.arch.lifecycle.LiveData<T>
↳ android.arch.lifecycle.MutableLiveData<T>
↳ android.arch.lifecycle.MediatorLiveData<T>
java.lang.Object
↳ android.arch.lifecycle.LiveData
↳ android.arch.lifecycle.MutableLiveData
↳ android.arch.lifecycle.LiveData
现在很明显,MediatorLiveData是MutableLiveData的一个子类,因此MediatorLiveData可以访问MutableLiveData以及LiveData的每个属性 第一个问题的答案是部分的,其余部分将在第二个问题的答案末尾讨论 在研究了一些示例项目以及android开发者的官方网站之后,我发现MutableLiveData应该只用于在观察任何数据时通知用户界面 例如,您希望在两个不同的片段(Fragment1和Fragment2)上显示两个Seekbar,并且还希望在从Fragment1操作时同步它们 另一个场景是,我们有两个LiveData实例,我们将它们命名为liveData1和liveData2,我们希望将它们的排放合并到一个对象中:LiveDataMerge(这是一个LiveData对象)。然后,liveData1和liveData2将成为LiveDataMerge的源,每次为它们中的任何一个调用onChanged回调时,我们都会在LiveDataMerge中设置一个新值
LiveData liveData1 = ...;
LiveData liveData2 = ...;
MediatorLiveData liveDataMerger = new MediatorLiveData<>();
liveDataMerger.addSource(liveData1, value ->liveDataMerger.setValue(value));
liveDataMerger.addSource(liveData2, value -> liveDataMerger.setValue(value));
LiveData-liveData1=。。。;
LiveData liveData2=。。。;
MediatorLiveData LiveDataMerge=新的MediatorLiveData();
addSource(liveData1,value->livedatamerge.setValue(value));
addSource(liveData2,value->livedatamerge.setValue(value));
在这种情况下,您不能使用MutableLiveData,但另一方面,如果您想将数据与第一个示例(使用了MutableLiveData)进行比较,则不能使用,因为您将无法使用addSource属性(根据类层次结构).MediatorLiveData是MutableLiveData的一个子类,它可以观察其他LiveData对象,并对来自这些对象的已更改事件作出反应 例如,如果用户界面中有一个可以从本地数据库或网络更新的LiveData对象,则可以向MediatorLiveData对象添加以下源: 与数据库中存储的数据关联的LiveData对象。 与从网络访问的数据关联的LiveData对象。 您的活动只需观察MediatorLiveData对象即可从两个源接收更新 MediatorLiveData提供了添加和删除源的方法-
- addSource(LiveData源,观察者一经更改)
- removeSource(实时数据到远程)
MediatorLiveData MediatorLiveData=new MediatorLiveData();
public MutableLiveData liveData1=新的MutableLiveData();
public MutableLiveData liveData2=新的MutableLiveData();
mediatorLiveData.addSource(liveData1,
新观察员(){
@凌驾
更改后的公共void(字符串s){
mediatorLiveData.setValue(s+“-liveData1”观察者的发射);
}
}
);
mediatorLiveData.addSource(liveData2,
新观察员(){
@凌驾
更改后的公共void(字符串s){
mediatorLiveData.setValue(s+“-liveData2”观察者的发射);
}
}
)
mediatorLiveData.observe(这个,新的观察者(){
@凌驾
更改后的公共void(字符串s){
Toast.makeText(上下文,s,Toast.LENGTH_SHORT).show();
}
});
postValue(“hello”)//输出:hello-来自liveData1的观察者的发射
postValue(“world”)//输出:world-来自liveData2观察者的发射
使用mediatorLiveData的addSource()方法将2个liveData添加到mediatorLiveData。
addSource()方法的定义如下:
addSource(LiveData<S> source, Observer<S> onChanged)
addSource(LiveData源,观察者一经更改)
更改源值时将调用onChanged observer。在这个观察器中,您可以将值发送到mediatorLiveData(您可以调用setValue()、postValue()方法)。这样,您就有了1个mediatorLiveData,它监听2个liveData。当liveData1或liveData2中保存的数据发生更改时,将调用mediatorLiveData的观察者!为什么?因为在mediatorLiveData的addSource()方法的第二个参数中,您将排放放入mediatorLiveData。mediatorLiveData是为
LiveData liveData1 = ...;
LiveData liveData2 = ...;
MediatorLiveData liveDataMerger = new MediatorLiveData<>();
liveDataMerger.addSource(liveData1, value ->liveDataMerger.setValue(value));
liveDataMerger.addSource(liveData2, value -> liveDataMerger.setValue(value));
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
addSource(LiveData<S> source, Observer<S> onChanged)