Es gibt zwei Möglichkeiten, wie Sie den Wert von ändern können MutableLiveData
. Aber was ist der Unterschied zwischen setValue()
& postValue()
in MutableLiveData
.
Ich konnte keine Dokumentation dafür finden.
Hier ist Klasse MutableLiveData
von 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);
}
}
quelle
Alle obigen Antworten sind richtig. Aber noch ein wichtiger Unterschied. Wenn Sie
postValue()
ein Feld aufrufen , das keine Beobachter hat, und danach anrufengetValue()
, erhalten Sie nicht den Wert, den Sie festgelegt habenpostValue()
. Seien Sie also vorsichtig, wenn Sie in Hintergrund-Threads ohne Beobachter arbeiten.quelle
setValue()
wenn möglich und 'postValue ()' nur bei Bedarf vorsichtig zu verwenden. DankenoObserveLiveData.postValue("sample")
In Activity implementiert habe , als ich getValue verwendetviewModel.noObserveLiveData.getValue
habe, meinen Sie, ist es nicht der Wert, den ich in postValue () ("sample") festgelegt habe?setValue()
wird direkt vom Aufrufer-Thread aufgerufen, benachrichtigt Beobachter synchron und ändert denLiveData
Wert sofort. Es kann nur von MainThread aufgerufen werden.postValue()
verwendet in so etwasnew Handler(Looper.mainLooper()).post(() -> setValue())
, so läuft essetValue
überHandler
in MainThread. Es kann von jedem Thread aufgerufen werden.quelle
setValue()
postValue
quelle
Dies ist keine direkte Antwort auf das oben genannte Problem. Die Antworten von Sagar und w201 sind fantastisch. Eine einfache Faustregel, die ich in ViewModels für MutableLiveData verwende, lautet jedoch:
Ersetzen Sie
mutVal
durch Ihren gewünschten Wert.quelle
setValue()
Methode muss vom Hauptthread aufgerufen werden. Wenn Sie einen Wert aus einem Hintergrundthread festlegen müssen, können Sie diesen verwendenpostValue()
.Mehr hier .
quelle
In unserer App haben wir einzelne LiveData verwendet, die Daten für mehrere Ansichten in einer Aktivität / einem Bildschirm enthalten. Grundsätzlich N Anzahl Datensätze für N Anzahl Ansichten. Dies hat uns ein wenig beunruhigt, weil die Art und Weise, wie postData entwickelt wurde. Und wir haben ein Statusobjekt in LD, das anzeigt, welche Ansicht aktualisiert werden muss.
LD sieht also so aus:
Es gibt einige Ansichten (view_1 und view_2), die aktualisiert werden mussten, wenn ein Ereignis eintritt. Dies bedeutet, dass sie gleichzeitig benachrichtigt werden sollten, wenn ein Ereignis eintritt. Also rief ich an:
Dies würde aus uns bekannten Gründen nicht funktionieren.
Was ich verstanden habe ist, dass im Grunde eine LD nur eine Ansicht darstellen sollte. Dann besteht keine Chance, dass Sie postData () zweimal hintereinander aufrufen müssen. Selbst wenn Sie anrufen, ist die Art und Weise, wie postData für Sie damit umgeht, genau das, was Sie auch erwarten würden (die neuesten Daten werden für Sie angezeigt). Alles passt gut zusammen.
quelle