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

我搜索了很多,但没有找到问题的清晰答案:

  • MediatorLiveData和MutableLiveData之间有什么区别

  • 使用它们的合适条件是什么

  • 是的子类,它公开了setValue和postValue方法(第二个方法是线程安全的),因此您可以将值分派给任何活动的观察者

    可以观察其他LiveData对象(源)并对其onChange事件作出反应,这将使您能够控制何时传播该事件或执行某些特定操作

    看看下面谷歌的例子:

    让我们考虑我们只需要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(实时数据到远程)
    检查此处的官方文件,例如-

    了解LiveData的详细信息,请点击此处-

    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)