Il existe deux manières de rendre la valeur de changement MutableLiveData
. Mais quelle est la différence entre setValue()
et postValue()
dans MutableLiveData
.
Je n'ai pas trouvé de documentation pour la même chose.
Voici la classe MutableLiveData
d'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);
}
}
Basé sur la documentation:
Définit la valeur. S'il y a des observateurs actifs, la valeur sera envoyé à eux. Cette méthode doit être appelée à partir du thread principal.
Publie une tâche sur un thread principal pour définir la valeur donnée. Si vous appeliez cette méthode plusieurs fois avant qu'un thread principal n'exécute une tâche publiée, seule la dernière valeur serait distribuée.
En résumé, la principale différence serait:
La méthode setValue()
doit être appelée à partir du thread principal. Mais si vous devez définir une valeur à partir d'un thread en arrière-plan, vous devez utiliser postValue()
.
Toutes les réponses ci-dessus sont correctes. Mais une autre différence importante. Si vous appelez postValue()
sur un champ sans observateur et que vous appelez ensuite getValue()
, vous ne recevez pas la valeur que vous avez définie dans postValue()
. Soyez donc prudent si vous travaillez dans des threads d'arrière-plan sans observateur.
setValue()
est appelé directement par le fil de l'appelant et avise les observateurs de manière synchrone. En outre, il ne peut être appelé que depuis MainThread.postValue()
utilise à l'intérieur quelque chose comme ceci new Handler(Looper.mainLooper()).post(() -> setValue())
, ainsi il exécute setValue
via Handler
dans MainThread En outre, il peut être appelé à partir de n’importe quel fil.
Définit la valeur. S'il y a des observateurs actifs, la valeur leur sera envoyée.
Cette méthode doit être appelée à partir du thread principal.
Si vous devez définir une valeur à partir d'un thread en arrière-plan, vous pouvez utiliser
postValue(Object)
.Publie une tâche sur un thread principal pour définir la valeur donnée.
Si vous appeliez cette méthode plusieurs fois avant qu'un thread principal n'exécute une tâche publiée, seule la dernière valeur serait distribuée.
La méthode setValue()
doit être appelée à partir du thread principal. Si vous devez définir une valeur à partir d'un thread en arrière-plan, vous pouvez utiliser postValue()
.
Plus ici .