Quelle est la différence entre MediatorLiveData et MutableLiveData dans MVVM
j'ai beaucoup cherché mais pas trouvé le cristal de réponse claire aux questions:
Quelle est la différence entre MediatorLiveData et MutableLiveData?
Ce sont la condition pour utiliser l'un ou l'autre.
3 réponses
MutableLiveData est une sous-classe de LiveData thats expose les méthodes setValue et postValue (la seconde est thread safe), de sorte que vous pouvez 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 quand vous voulez propager l'événement, ou faire quelque chose en particulier.
jetez un oeil de suite exemple de google:
imaginons que nous voulons seulement 10 valeurs émises par liveData1, pour être fusionné dans le liveDataMerger. Puis, après 10 valeurs, nous pouvons arrêter écouter liveData1 et l'enlever comme 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); } } });
il faut d'abord 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>
maintenant il est clair que MediatorLiveData est une sous-classe de MutableLiveData donc MediatorLiveData peut accéder à chaque propriété de MutableLiveData aussi bien Qu'à LiveData.
la Question. 1 réponse partiellement et dans le reste de la réponse sera discuté à la fin de la Question. 2 réponse.
après des recherches sur certains projets d'échantillon ainsi que le site officiel du développeur android j'ai trouvé que MutableLiveData devrait être utilisé seulement pour notifier votre UI lors de l'observation de toutes les données.
par exemple, vous voulez afficher deux SeekBars sur deux fragments différents(Fragment1 et Fragment2) et vous voulez aussi qu'ils soient synchronisés lors d'une opération à partir de Fragment1.
un autre scénario est que nous avons 2 instances de LiveData, appelons-les liveData1 et liveData2, et nous voulons fusionner leurs émissions dans un seul objet: liveDataMerger (qui est un objet MediatorLiveData). Ensuite, liveData1 et liveData2 deviendront des sources pour le liveDataMerger et chaque fois qu'un callback modifié est appelé pour l'un ou l'autre d'entre 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 d'un autre côté si vous voulez comparer les données dans le premier exemple (où MutableLiveData a été utilisé) alors vous ne pouvez pas parce que vous ne pourrez pas utiliser la propriété addSource (selon la hiérarchie de classe).
MediatorLiveData
maintenez application
objet pour gérer certaines conditions. eg: vous pouvez avoir besoin de traiter un certain systemService tel que LocationManager, Resource. Et vous pouvez livrer dataEvent
par MediatorLiveData
.
MutableLiveData
n'ont pas de membre comme MediatorLiveData
est.