MVVM中的MediatorLiveData和MutableLiveData有什么区别


73

我进行了很多搜索,但找不到以下问题的明确答案:

  1. MediatorLiveData和MutableLiveData有什么区别?

  2. 什么条件适合使用它们中的任何一个?


MediatorLiveData是MutableLiveData的子类,你要观察的变化来自多个LiveData instances.This方案并行迄今为止最好的说明文档中这里的情况作出developer.android.com/reference/android/arch/lifecycle/...
TapanHP

Answers:


52

首先,我们需要了解MutableLivedataMediatorLivedata之间的关系是什么,以了解它们之间的区别。

java.lang.Objectandroid.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)上显示两个SeekBar,并且还希望在从Fragment1操作时使它们同步。

另一种情况是,我们有两个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属性(根据类层次结构)。


3
After researching on some sample projects as well as android developer's official site I found that MutableLiveData should be used only for notifying your UI when observing any data.如果您可以提供这样的官方网站,那就太好了。您可以通过链接更新答案吗?
萨加尔


35

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

MediatorLiveData可以观察其他LiveData对象(源)并对它们的onChange事件做出反应,这将使您可以控制何时传播事件或进行特定操作。

看一下以下Google的示例:

让我们考虑一下,我们只希望将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);
          }
      }
 });

科特林

liveDataMerger.addSource(liveData1, object : Observer<Int> {
    private var count = 1

    override fun onChanged(s: Int?) {
        count++
        liveDataMerger.value = s
        if (count > 10) {
            liveDataMerger.removeSource(liveData1)
        }
    }
})

谢谢@Ariel :)
Braian Coronel

11
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中。


5

MediatorLiveDataMutableLiveData的子类,可以观察其他LiveData对象并对其中的OnChanged事件做出反应。

例如,如果您的UI中有可以从本地数据库或网络更新的LiveData对象,则可以将以下源添加到MediatorLiveData对象:与数据库中存储的数据关联的LiveData对象。与从网络访问的数据关联的LiveData对象。您的活动仅需要观察MediatorLiveData对象即可从两个来源接收更新。

MediatorLiveData提供了添加和删除源的方法-

  • addSource(LiveData源,Observer onChanged)
  • removeSource(LiveData toRemote)

在此处查看官方文档,例如-https://developer.android.com/reference/android/arch/lifecycle/MediatorLiveData

在LiveData读好,点击这里- https://medium.com/@elye.project/understanding-live-data-made-simple-a820fcd7b4d0


-12

MediatorLiveData握住一个application物体来处理某种情况。例如:您可能需要处理一些systemService,例如LocationManager,Resource。您可以dataEvent通过发送MediatorLiveDataMutableLiveData没有像MediatorLiveDatais这样的成员。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.