137 votes

Différence de setValue () et postValue () dans MutableLiveData

Il existe deux façons de faire changer la valeur de MutableLiveData . Mais quelle est la différence entre setValue() & postValue() en MutableLiveData .

Je n'ai pas pu trouver de documentation pour le même.

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);
    }
}
 

238voto

Sagar Points 12352

Sur la base des documents:

setValue():

Définit la valeur. Si il y a des observateurs actifs, la valeur sera distribué à eux. Cette méthode doit être appelée à partir du thread principal.

postValue():

Postes une tâche à un thread principal pour définir la valeur donnée. Si vous avez appelé cette méthode plusieurs fois avant que le thread principal exécuté une posté tâche, seule la dernière valeur serait distribué.

Pour résumer, la différence serait:

setValue() méthode doit être appelée à partir du thread principal. Mais si vous avez besoin de définir une valeur à partir d'un thread d'arrière-plan, postValue() doit être utilisé.

126voto

w201 Points 671

Toutes les réponses ci-dessus sont correctes. Mais une différence de plus importante. Si vous appelez postValue() sur un champ qui n'a pas d'observateurs et après cela vous appelez 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 observateurs.

24voto

Ufkoku Points 1363

setValue() est appelé directement à partir du thread appelant et avertit de manière synchrone les observateurs. De plus, il ne peut être appelé que depuis MainThread.
postValue() utilise à l'intérieur de quelque chose comme ceci new Handler(Looper.mainLooper()).post(() -> setValue()) , donc il s'exécute setValue via Handler dans MainThread. Il peut également être appelé à partir de n'importe quel thread.

14voto

Nilesh Rathod Points 34836

setValue()

Définit la valeur. Si il y a des observateurs actifs, la valeur sera envoyée à eux.

Cette méthode doit être appelée à partir du thread principal.

postValue

Si vous avez besoin de définir une valeur à partir d'un thread d'arrière-plan, vous pouvez utiliser postValue(Object)

Postes une tâche à un thread principal pour définir la valeur donnée.

Si vous avez appelé cette méthode plusieurs fois avant que le thread principal exécuté une posté tâche, seule la dernière valeur serait distribué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X