Hay dos formas de hacer que el cambio valga la pena MutableLiveData
. Pero, ¿cuál es la diferencia entre setValue()
& postValue()
in MutableLiveData
.
No pude encontrar documentación para el mismo.
Aquí está la clase MutableLiveData
de Android.
package android.arch.lifecycle;
/**
* {@link LiveData} which publicly exposes {@link #setValue(T)} and {@link #postValue(T)} method.
*
* @param <T> The type of data hold by this instance
*/
@SuppressWarnings("WeakerAccess")
public class MutableLiveData<T> extends LiveData<T> {
@Override
public void postValue(T value) {
super.postValue(value);
}
@Override
public void setValue(T value) {
super.setValue(value);
}
}
fuente
Todas las respuestas anteriores son correctas. Pero una diferencia más importante. Si llama
postValue()
a un campo que no tiene observadores y luego llamagetValue()
, no recibe el valor que estableciópostValue()
. Así que tenga cuidado si trabaja en subprocesos en segundo plano sin observadores.fuente
setValue()
si es posible, y usar con precaución 'postValue ()', solo cuando sea necesario. GraciasnoObserveLiveData.postValue("sample")
, En Actividad, cuando usé getValue comoviewModel.noObserveLiveData.getValue
¿Quieres decir que no es el valor que establecí en postValue () ("muestra")?setValue()
se llama directamente desde el hilo de llamada, notifica sincrónicamente a los observadores y cambia elLiveData
valor inmediatamente. Solo se puede llamar desde MainThread.postValue()
usa dentro de algo como estonew Handler(Looper.mainLooper()).post(() -> setValue())
, por lo que se ejecuta asetValue
travésHandler
de MainThread. Se puede llamar desde cualquier hilo.fuente
setValue()
postValue
fuente
Esta no es una respuesta directa al problema anterior. Las respuestas de Sagar y w201 son impresionantes. Pero una regla general simple que uso en ViewModels para MutableLiveData es:
Reemplace
mutVal
con su valor deseado.fuente
setValue()
se debe llamar al método desde el hilo principal. Si necesita establecer un valor de un hilo en segundo plano, puede usarpostValue()
.Más aquí .
fuente
En nuestra aplicación, usamos LiveData único que contiene datos para múltiples vistas en una actividad / pantalla. Básicamente N número de conjuntos de datos para N número de vistas. Esto nos preocupó un poco debido a la forma en que está diseñado postData. Y tenemos un objeto de estado en LD que transmite una vista sobre qué vista necesita actualizarse.
entonces LD se ve así:
Hay un par de vistas (vista_1 y vista_2) que debían actualizarse cuando se produce un evento ... lo que significa que deberían recibir una notificación al mismo tiempo cuando ocurre un evento. Entonces, llamé:
Esto no funcionaría por razones que conocemos.
Lo que entendí es que básicamente un LD debería representar solo una vista. Entonces no hay posibilidad de que tenga que llamar a postData () dos veces seguidas. Incluso si llama, la forma en que postData lo maneja es lo que también esperaría (mostrando los últimos datos a la vista). Todo cae bien en su lugar.
fuente