web-dev-qa-db-ja.com

MVVMのMediatorLiveDataとMutableLiveDataの違いは何ですか

私はよく検索しましたが、質問に対する明確な答えは見つかりませんでした。

  1. MediatorLiveDataとMutableLiveDataの違いは何ですか?

  2. どちらを使用するのに適した条件は何ですか。

43
Lalit Kushwah

最初に、 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は部分的に回答され、残りの回答については質問番号の最後で説明します。 2の答え。

いくつかのサンプルプロジェクトとAndroid開発者の公式サイトを調べた結果、MutableLiveDataはデータを監視するときにUIに通知するためだけに使用する必要があることがわかりました。

たとえば、2つの異なるフラグメント(Fragment1およびFragment2)に2つのSeekBarsを表示し、Fragment1から操作するときにそれらを同期させたいとします。

もう1つのシナリオは、LiveDataの2つのインスタンスがあり、それらをliveData1とliveData2と名付け、それらの放出を1つのオブジェクト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プロパティを使用できないため(クラス階層ごと)使用できません。

25
Asad

MutableLiveDataLiveData のサブクラスであり、setValueメソッドとpostValueメソッドを公開しています(2番目のメソッドはスレッドセーフです)。アクティブなオブザーバーに値をディスパッチできます。

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);
          }
      }
 });
20
Ariel Carbonaro

MediatorLiveData のサブクラスです MutableLiveData 他のLiveDataオブジェクトを監視し、それらからのOnChangedイベントに反応できます。

たとえば、ローカルデータベースまたはネットワークから更新できるLiveDataオブジェクトがUIにある場合、次のソースを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-a820fcd7b4d

1
Orton