2017-10-25 15 views

Odpowiedz

1

MutableLiveData jest podklasą LiveData ów naraża setValue i metod postValue (drugi jest bezpieczne dla wątków), więc można wysyłką wartość wszelkich aktywnych obserwatorów.

MediatorLiveData może obserwować inne obiekty LiveData (źródła) i reagować na zdarzenia onChange, co daje kontrolę nad tym, kiedy chcesz propagować wydarzenie, lub zrobić coś w szczególności.

Spójrz na poniższy przykład Google:

Rozważmy, że chcemy tylko 10 wartości emitowanych przez liveData1, aby być połączyła w liveDataMerger. Następnie, po 10 wartościach, możemy zatrzymać słuchanie liveData1 i usunąć go jako źródło.

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); 
      } 
     } 
}); 
-1

MediatorLiveData trzymanie przedmiotu application obsłużyć jakiś warunek. na przykład: może zajść potrzeba przetworzenia jakiejś usługi systemService, takiej jak LocationManager, Resource. I możesz dostarczyć dataEvent przez MediatorLiveData. MutableLiveData nie ma żadnego użytkownika takiego jak MediatorLiveData.

0

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).

Powiązane problemy