web-dev-qa-db-ja.com

MutableLiveDataのsetValue()とpostValue()の違い

MutableLiveDataの値を変更する方法は2つあります。しかし、MutableLiveDatasetValue()postValue()の違いは何ですか?.

私は同じドキュメントを見つけることができませんでした。

これがAndroidのクラスMutableLiveDataです。

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

ドキュメントに基づいて:

setValue()

値を設定します。アクティブなオブザーバーがある場合、値はそれらにディスパッチされます。このメソッドは、メインスレッドから呼び出す必要があります。

postValue()

指定された値を設定するために、タスクをメインスレッドにポストします。メインスレッドがポストされたタスクを実行する前にこのメソッドを複数回呼び出した場合、最後の値のみがディスパッチされます。

要約すると、重要な違いは次のとおりです。

setValue()メソッドは、メインスレッドから呼び出す必要があります。ただし、バックグラウンドスレッドから値を設定する必要がある場合は、postValue()を使用する必要があります。

82
Sagar

上記の答えはすべて正しいです。しかし、もう1つの重要な違いがあります。オブザーバーのないフィールドでpostValue()を呼び出した後、getValue()を呼び出すと、postValue()で設定した値を受け取りません。したがって、オブザーバなしでバックグラウンドスレッドで作業する場合は注意してください。

43
w201

setValue()

値を設定します。アクティブなオブザーバーがある場合、値はそれらにディスパッチされます。

このメソッドはメインスレッドから呼び出す必要があります

postValue

バックグラウンドスレッドから値を設定する必要がある場合は、postValue(Object)を使用できます。

指定された値を設定するために、タスクをメインスレッドにポストします。

メインスレッドがポストされたタスクを実行する前にこのメソッドを複数回呼び出した場合、最後の値のみがディスパッチされます。

9
Nilesh Rathod

setValue()は呼び出し元スレッドから直接呼び出され、オブザーバーに同期的に通知します。また、MainThreadからのみ呼び出すことができます。
postValue()は、このnew Handler(Looper.mainLooper()).post(() -> setValue())のような内部で使用するため、MainThreadのsetValueを介してHandlerを実行します。また、どのスレッドからも呼び出すことができます。

6
Ufkoku

setValue()メソッドはメインスレッドから呼び出す必要があります。バックグラウンドスレッドから値を設定する必要がある場合は、postValue()を使用できます。

もっと こちら

3
Levon Petrosyan