MVVM中的MediatorLiveData和MutableLiveData有什么区别

Lal*_*wah 51 android android-livedata android-architecture

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

  1. MediatorLiveData和MutableLiveData有什么区别?

  2. 使用其中任何一种的合适条件是什么.

Asa*_*sad 34

首先,我们需要知道MutableLivedataMediatorLivedata之间的关系,以了解它们之间的区别.

java.lang.Object
  ? android.arch.lifecycle.LiveData<T>
      ? android.arch.lifecycle.MutableLiveData<T>
          ? android.arch.lifecycle.MediatorLiveData<T>
Run Code Online (Sandbox Code Playgroud)

现在很清楚,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));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您不能使用MutableLiveData,但另一方面,如果您想将数据比较到第一个示例(使用MutableLiveData),那么您不能,因为您将无法使用addSource属性(根据类层次结构).

  • “在研究了一些示例项目以及android开发人员的官方网站后,我发现MutableLiveData仅应用于在观察任何数据时通知UI。”如果您可以提供这样的官方网站,那就太好了。您可以通过链接更新答案吗? (2认同)

Ari*_*aro 21

MutableLiveDataLiveData的子类,暴露了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);
          }
      }
 });
Run Code Online (Sandbox Code Playgroud)


oiy*_*yio 17

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
Run Code Online (Sandbox Code Playgroud)

使用 mediatorLiveData 的 addSource() 方法将 2 个 liveData 添加到 mediatorLiveData。addSource() 方法的定义如下:

addSource(LiveData<S> source, Observer<S> onChanged)
Run Code Online (Sandbox Code Playgroud)

当源值更改时,将调用 onChanged 观察者。在这个观察者中,您可以将值发送到 mediatorLiveData(您可以调用 setValue()、postValue() 方法)。通过这种方式,您有 1 个 mediatorLiveData 来监听 2 个 liveData。当 liveData1 或 liveData2 中持有的数据发生变化时,调用 mediatorLiveData 的观察者!为什么?因为您在 MediatorLiveData 的 addSource() 方法的第二个参数中向 mediatorLiveData 进行了排放。


Ort*_*ton 7

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