tutorial observeforever livedata example ejemplo data arch android android-livedata android-architecture

android - observeforever - ¿Cuál es la diferencia entre MediatorLiveData y MutableLiveData en MVVM?



livedata tutorial android (3)

He buscado mucho pero no he encontrado la respuesta clara para las preguntas:

  1. ¿Cuál es la diferencia entre MediatorLiveData y MutableLiveData?

  2. ¿Cuáles son las condiciones adecuadas para utilizar cualquiera de ellos.


Al principio necesitamos saber cuál es la relación entre MutableLivedata y MediatorLivedata para comprender la diferencia entre ellos.

java.lang.Object ↳ android.arch.lifecycle.LiveData<T> ↳ android.arch.lifecycle.MutableLiveData<T> ↳ android.arch.lifecycle.MediatorLiveData<T>

Ahora está claro que MediatorLiveData es una subclase de MutableLiveData, por lo tanto, MediatorLiveData puede acceder a todas y cada una de las propiedades de MutableLiveData, así como a LiveData.

Pregunta no. 1 se responde parcialmente y el resto de la respuesta se discutirá al final de la Pregunta no. La respuesta de 2.

Después de investigar en algunos proyectos de muestra, así como en el sitio oficial del desarrollador de Android, descubrí que MutableLiveData debería usarse solo para notificar su UI al observar datos.

Por ejemplo, desea mostrar dos SeekBars en dos fragmentos diferentes (Fragment1 y Fragment2) y también desea sincronizarlos cuando se opera desde Fragment1.

Otro escenario es que tenemos 2 instancias de LiveData, llamémoslas liveData1 y liveData2, y queremos fusionar sus emisiones en un objeto: liveDataMerger (que es un objeto MediatorLiveData). Entonces, liveData1 y liveData2 se convertirán en fuentes para liveDataMerger y cada vez que se llame a callChanged para cualquiera de ellos, estableceremos un nuevo valor en liveDataMerger.

LiveData liveData1 = ...; LiveData liveData2 = ...; MediatorLiveData liveDataMerger = new MediatorLiveData<>(); liveDataMerger.addSource(liveData1, value ->liveDataMerger.setValue(value)); liveDataMerger.addSource(liveData2, value -> liveDataMerger.setValue(value));

En este caso, no puede usar MutableLiveData pero, por otro lado, si desea comparar datos en el primer ejemplo (donde se ha usado MutableLiveData), no puede porque no podrá usar la propiedad addSource (según la jerarquía de clases).


MutableLiveData es una subclase de LiveData que expone los métodos setValue y postValue (el segundo es seguro para subprocesos), por lo que puede enviar un valor a cualquier observador activo.

MediatorLiveData puede observar otros objetos LiveData (fuentes) y reaccionar a sus eventos onChange, esto le dará control sobre cuándo desea propagar el evento o hacer algo en particular.

Eche un vistazo al siguiente ejemplo de google:

Consideremos que solo queremos que 10 valores emitidos por liveData1 se fusionen en liveDataMerger. Luego, después de 10 valores, podemos dejar de escuchar liveData1 y eliminarlo como fuente.

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 retiene un objeto de application para manejar alguna condición. por ejemplo: es posible que necesite procesar algún servicio del sistema como LocationManager, Resource. Y puede entregar dataEvent través de MediatorLiveData . MutableLiveData no tiene ningún miembro como MediatorLiveData es.