Na początku musimy wiedzieć, jaka jest relacja między MutableLivedata i MediatorLivedata, aby zrozumieć różnicę między nimi.
java.lang.Object
↳ android.arch.lifecycle.LiveData<T>
↳ android.arch.lifecycle.MutableLiveData<T>
↳ android.arch.lifecycle.MediatorLiveData<T>
Teraz jest jasne, że MediatorLiveData jest podklasą MutableLiveData dlatego MediatorLiveData mogą uzyskać dostęp za każdym własność MutableLiveData jak również LiveData.
Pytanie nr. 1 odpowiada częściowo, a reszta odpowiedzi zostanie omówiona na końcu pytania nr. Odpowiedź 2.
Po zbadaniu niektórych przykładowych projektów, a także oficjalnej strony dla programistów Androida, stwierdziłem, że MutableLiveData powinno być używane tylko do powiadamiania Twojego interfejsu użytkownika podczas obserwacji jakichkolwiek danych.
Na przykład, chcesz wyświetlić dwie ramki SeekBar na dwóch różnych fragmentach (Fragment 1 i Fragment 2), a także chcesz je zsynchronizować podczas pracy z Fragmentu 1.
Innym scenariuszem jest to, że mamy 2 wystąpienia LiveData, nazwijmy je liveData1 i liveData2, a my chcemy połączyć ich emisje w jeden obiekt: liveDataMerger (który jest obiektem MediatorLiveData). Następnie liveData1 i liveData2 staną się źródłami dla liveDataMerger i za każdym razem, gdy wywołanie callback zostanie zmienione na jeden z nich, ustawiamy nową wartość w liveDataMerger.
LiveData liveData1 = ...;
LiveData liveData2 = ...;
MediatorLiveData liveDataMerger = new MediatorLiveData<>();
liveDataMerger.addSource(liveData1, value ->liveDataMerger.setValue(value));
liveDataMerger.addSource(liveData2, value -> liveDataMerger.setValue(value));
W tym przypadku nie można wykorzystać MutableLiveData ale z drugiej strony, jeśli chcesz porównać dane w pierwszym przykładzie (gdzie została wykorzystana MutableLiveData) to nie można, ponieważ nie będzie w stanie użyć właściwości ADDSOURCE (zgodnie z hierarchią klas).