89

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

  1. MediatorLiveData 和 MutableLiveData 有什么区别?

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

4

5 回答 5

66

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

java.lang.Object
  ↳ android.arch.lifecycle.LiveData<T>
      ↳ android.arch.lifecycle.MutableLiveData<T>
          ↳ android.arch.lifecycle.MediatorLiveData<T>

现在很清楚 MediatorLiveData 是 MutableLiveData 的子类,因此 MediatorLiveData 可以访问 MutableLiveData 以及 LiveData 的每个属性。

问号 1 部分回答,其余答案将在第 1 号问题的末尾讨论。2的回答。

在研究了一些示例项目以及 android 开发人员的官方网站后,我发现 MutableLiveData 应该仅用于在观察任何数据时通知您的 UI。

例如,您希望在两个不同的 Fragment(Fragment1 和 Fragment2)上显示两个 SeekBar,并且您还希望在从 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 属性(根据类层次结构)。

于 2018-02-16T13:49:44.263 回答
41

MutableLiveData是 LiveData 的子类,公开了 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)
        }
    }
})
于 2017-11-10T13:01:50.253 回答
20
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 进行了排放。

于 2019-12-17T14:42:12.817 回答
9

MediatorLiveDataMutableLiveData的子类,可以观察其他 LiveData 对象并对来自它们的 OnChanged 事件作出反应。

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

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

  • addSource(LiveData 源,观察者 onChanged)
  • removeSource(LiveData 到远程)

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

很好地阅读 LiveData,在这里查看 - https://medium.com/@elye.project/understanding-live-data-made-simple-a820fcd7b4d0

于 2019-04-20T12:43:13.777 回答
-16

MediatorLiveData持有一个application对象来处理一些条件。eg:你可能需要处理一些systemService,比如LocationManager,Resource。您可以dataEvent通过MediatorLiveData. MutableLiveData没有像MediatorLiveDatais 这样的成员。

于 2017-12-28T09:19:18.357 回答