web-dev-qa-db-fra.com

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

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

Basé sur la documentation:

setValue () :

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.

postValue () :

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().

30
Sagar

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.

14
w201

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.

4
Ufkoku

setValue()

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

postValue

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.

3
Nilesh Rathod

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 .

1
Levon Petrosyan