Я много искал, но не нашел кристально чистого ответа на вопросы:
-
В чем разница между MediatorLiveData и MutableLiveData?
-
Каковы подходящие условия для использования любого из них.
Я много искал, но не нашел кристально чистого ответа на вопросы:
В чем разница между MediatorLiveData и MutableLiveData?
Каковы подходящие условия для использования любого из них.
Сначала нам нужно знать, какова связь между 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 (согласно иерархии классов).
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); } } });
MediatorLiveData является подклассом MutableLiveData, который может наблюдать за другими объектами LiveData и реагировать на них событиями OnChanged.
Например, если у вас есть объект LiveData в вашем пользовательском интерфейсе, который можно обновить из локальной базы данных или сети, вы можете добавить следующие источники в объект MediatorLiveData: объект LiveData, связанный с данными, хранящимися в базе данных. Объект LiveData, связанный с данными, доступ к которым осуществляется из сети. Ваша деятельность должна только наблюдать объект MediatorLiveData для получения обновлений из обоих источников.
MediatorLiveData предоставляет методы для добавления и удаления источника -
Проверьте официальный документ здесь, например - https://developer.android.com/reference/android/arch/lifecycle/MediatorLiveData
Хорошее чтение на LiveData, проверьте здесь - https://medium.com/@elye.project/understanding-live-data-made-simple-a820fcd7b4d0
MediatorLiveData
содержит объект application
для обработки некоторого условия. например: вам может потребоваться обработать некоторые системные службы, такие как LocationManager, Resource. И вы можете доставить dataEvent
через MediatorLiveData
. MutableLiveData
не имеет такого члена, как MediatorLiveData
.