MutableLiveData
の値を変更する方法は2つあります。しかし、MutableLiveData
のsetValue()
&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);
}
}
ドキュメントに基づいて:
値を設定します。アクティブなオブザーバーがある場合、値はそれらにディスパッチされます。このメソッドは、メインスレッドから呼び出す必要があります。
指定された値を設定するために、タスクをメインスレッドにポストします。メインスレッドがポストされたタスクを実行する前にこのメソッドを複数回呼び出した場合、最後の値のみがディスパッチされます。
要約すると、重要な違いは次のとおりです。
setValue()
メソッドは、メインスレッドから呼び出す必要があります。ただし、バックグラウンドスレッドから値を設定する必要がある場合は、postValue()
を使用する必要があります。
上記の答えはすべて正しいです。しかし、もう1つの重要な違いがあります。オブザーバーのないフィールドでpostValue()
を呼び出した後、getValue()
を呼び出すと、postValue()
で設定した値を受け取りません。したがって、オブザーバなしでバックグラウンドスレッドで作業する場合は注意してください。
値を設定します。アクティブなオブザーバーがある場合、値はそれらにディスパッチされます。
このメソッドはメインスレッドから呼び出す必要があります。
バックグラウンドスレッドから値を設定する必要がある場合は、
postValue(Object)
を使用できます。指定された値を設定するために、タスクをメインスレッドにポストします。
メインスレッドがポストされたタスクを実行する前にこのメソッドを複数回呼び出した場合、最後の値のみがディスパッチされます。
setValue()
は呼び出し元スレッドから直接呼び出され、オブザーバーに同期的に通知します。また、MainThreadからのみ呼び出すことができます。postValue()
は、このnew Handler(Looper.mainLooper()).post(() -> setValue())
のような内部で使用するため、MainThreadのsetValue
を介してHandler
を実行します。また、どのスレッドからも呼び出すことができます。
setValue()
メソッドはメインスレッドから呼び出す必要があります。バックグラウンドスレッドから値を設定する必要がある場合は、postValue()
を使用できます。
もっと こちら 。