Подтвердить что ты не робот

В чем разница между MediatorLiveData и MutableLiveData в MVVM

Я много искал, но не нашел кристально чистого ответа на вопросы:

  1. В чем разница между MediatorLiveData и MutableLiveData?

  2. Каковы подходящие условия для использования любого из них.

4b9b3361

Ответ 1

Сначала нам нужно знать, какова связь между MutableLivedata и MediatorLivedata, чтобы понять разницу между ними.

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 следует использовать только для уведомления вашего пользовательского интерфейса при наблюдении любых данных.

Например, вы хотите отобразить два SeekBars на двух разных фрагментах (Fragment1 и Fragment2), и вы также хотите, чтобы они синхронизировались при работе из Fragment1.

Другой сценарий состоит в том, что у нас есть 2 экземпляра LiveData, назовем их liveData1 и liveData2, и мы хотим объединить их выбросы в один объект: 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 (согласно иерархии классов).

Ответ 2

MutableLiveData - это подкласс LiveData, который предоставляет методы setValue и postValue (второй - поточно-безопасный), поэтому вы можете отправить значение любым активным наблюдателям.

MediatorLiveData может наблюдать другие объекты LiveData (источники) и реагировать на их события onChange, это даст вам возможность контролировать, когда вы хотите распространять событие, или что-то делать в частности.

Посмотрите следующий пример Google:

Предположим, что мы хотим только 10 значений, испускаемых liveData1, которые должны быть объединены в 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);
          }
      }
 });

Ответ 3

MediatorLiveData является подклассом MutableLiveData, который может наблюдать за другими объектами LiveData и реагировать на них событиями OnChanged.

Например, если у вас есть объект LiveData в вашем пользовательском интерфейсе, который можно обновить из локальной базы данных или сети, вы можете добавить следующие источники в объект 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-a820fcd7b4d0

Ответ 4

MediatorLiveData содержит объект application для обработки некоторого условия. например: вам может потребоваться обработать некоторые системные службы, такие как LocationManager, Resource. И вы можете доставить dataEvent через MediatorLiveData. MutableLiveData не имеет такого члена, как MediatorLiveData.