web-dev-qa-db-fra.com

Quelle est la différence entre MediatorLiveData et MutableLiveData dans MVVM

J'ai beaucoup cherché mais je n'ai pas trouvé la réponse claire aux questions:

  1. Quelle est la différence entre MediatorLiveData et MutableLiveData?

  2. Quelles sont les conditions appropriées pour utiliser l'un ou l'autre.

43
Lalit Kushwah

Au début, nous devons savoir quelle est la relation entre MutableLivedata et MediatorLivedata pour comprendre la différence entre eux.

Java.lang.Object
  ↳ Android.Arch.lifecycle.LiveData<T>
      ↳ Android.Arch.lifecycle.MutableLiveData<T>
          ↳ Android.Arch.lifecycle.MediatorLiveData<T>

Il est maintenant clair que MediatorLiveData est une sous-classe de MutableLiveData. MediatorLiveData peut donc accéder à toutes les propriétés de MutableLiveData ainsi qu'à LiveData.

Question n ° 1 reçoit une réponse partielle et le reste de la réponse sera examiné à la fin de la question no. La réponse de 2.

Après des recherches sur des exemples de projets ainsi que sur le site officiel du développeur Android, j'ai découvert que MutableLiveData ne devrait être utilisé que pour notifier votre interface utilisateur lors de l'observation de données.

Par exemple, vous souhaitez afficher deux barres SeekBars sur deux fragments différents (Fragment1 et Fragment2) et vous souhaitez également les synchroniser lorsqu’elles fonctionnent à partir de Fragment1.

Un autre scénario est que nous avons 2 instances de LiveData, appelons-les liveData1 et liveData2, et nous souhaitons fusionner leurs émissions dans un seul objet: liveDataMerger (qui est un objet MediatorLiveData). Ensuite, liveData1 et liveData2 deviendront des sources pour liveDataMerger et chaque fois que le rappel onChanged est appelé pour l'un d'eux, nous définissons une nouvelle valeur dans liveDataMerger.

LiveData liveData1 = ...;
LiveData liveData2 = ...;

MediatorLiveData liveDataMerger = new MediatorLiveData<>();
liveDataMerger.addSource(liveData1, value ->liveDataMerger.setValue(value));
liveDataMerger.addSource(liveData2, value -> liveDataMerger.setValue(value));

Dans ce cas, vous ne pouvez pas utiliser MutableLiveData, mais si vous souhaitez comparer des données dans le premier exemple (où MutableLiveData a été utilisé), vous ne pourrez pas utiliser la propriété addSource (selon la hiérarchie de classes).

25
Asad

MutableLiveData est une sous-classe de LiveData qui expose les méthodes setValue et postValue (la deuxième est thread-safe), vous pouvez ainsi envoyer une valeur à tous les observateurs actifs.

MediatorLiveData peut observer d'autres objets LiveData (sources) et réagir à leurs événements onChange. Cela vous donnera le contrôle sur le moment où vous souhaitez propager l'événement ou faire quelque chose de particulier.

Jetez un coup d'œil à l'exemple de Google suivant:

Considérons que nous ne voulons que 10 valeurs émises par liveData1, à fusionner dans le liveDataMerger. Ensuite, après 10 valeurs, nous pouvons arrêter d'écouter LiveData1 et le supprimer en tant que source.

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 est une sous-classe de MutableLiveData capable d'observer d'autres objets LiveData et de réagir aux événements OnChanged qu'ils contiennent.

Par exemple, si votre interface utilisateur contient un objet LiveData pouvant être mis à jour à partir d'une base de données locale ou d'un réseau, vous pouvez ajouter les sources suivantes à l'objet MediatorLiveData: Un objet LiveData associé aux données stockées dans la base de données. Un objet LiveData associé aux données accessibles depuis le réseau. Votre activité doit uniquement observer l'objet MediatorLiveData pour recevoir les mises à jour des deux sources.

MediatorLiveData fournit des méthodes pour ajouter et supprimer des sources -

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

Consultez la documentation officielle ici, par exemple - https://developer.Android.com/reference/Android/Arch/lifecycle/MediatorLiveData

Une bonne lecture sur LiveData, vérifiez ici - https://medium.com/@elye.project/understanding-live-data-made-simple-a820fcd7b4d

1
Orton