Ada dua cara yang membuat nilai perubahan MutableLiveData
. Tapi apa perbedaan antara setValue()
& postValue()
in MutableLiveData
.
Saya tidak dapat menemukan dokumentasi yang sama.
Ini dia kelas MutableLiveData
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);
}
}
sumber
Semua jawaban di atas benar. Tapi satu perbedaan penting lagi. Jika Anda memanggil
postValue()
di lapangan yang tidak memiliki pengamat dan setelah itu Anda memanggilgetValue()
, Anda tidak menerima nilai yang Anda tetapkanpostValue()
. Jadi berhati-hatilah jika Anda bekerja di thread latar belakang tanpa pengamat.sumber
setValue()
jika memungkinkan, dan hati-hati gunakan 'postValue ()', hanya jika diperlukan. Terima kasihnoObserveLiveData.postValue("sample")
, Dalam Aktivitas, ketika saya menggunakan getValue sepertiviewModel.noObserveLiveData.getValue
Maksud Anda Bukankah itu nilai yang saya tetapkan di postValue () ("sample")?setValue()
dipanggil langsung dari utas pemanggil, secara sinkron memberi tahu pengamat dan mengubahLiveData
nilai dengan segera. Ini hanya dapat dipanggil dari MainThread.postValue()
digunakan di dalam sesuatu seperti ininew Handler(Looper.mainLooper()).post(() -> setValue())
, sehingga berjalansetValue
melaluiHandler
di MainThread. Itu dapat dipanggil dari utas apa pun.sumber
setValue()
postValue
sumber
Ini bukanlah jawaban langsung untuk masalah di atas. Jawaban dari Sagar dan w201 luar biasa. Tapi aturan praktis sederhana yang saya gunakan di ViewModels untuk MutableLiveData adalah:
Gantilah
mutVal
dengan nilai yang Anda inginkan.sumber
setValue()
metode harus dipanggil dari utas utama. Jika Anda perlu menyetel nilai dari thread latar belakang, Anda dapat menggunakanpostValue()
.Lebih lanjut di sini .
sumber
Di aplikasi kami, kami telah menggunakan LiveData tunggal yang berisi data untuk beberapa tampilan di aktivitas / layar. Pada dasarnya N tidak ada dataset untuk N tidak ada view. Ini sedikit mengganggu kami karena cara postData dirancang. Dan kami memiliki objek status di LD yang menyampaikan untuk melihat tentang tampilan mana yang perlu diperbarui.
jadi LD terlihat seperti ini:
Ada beberapa tampilan (view_1 dan view_2) yang harus diupdate saat satu peristiwa terjadi..berarti tampilan tersebut harus mendapat pemberitahuan pada saat yang sama saat peristiwa terjadi. Jadi, saya menelepon:
Ini tidak akan berhasil karena alasan yang kita tahu.
Apa yang saya pahami adalah pada dasarnya satu LD seharusnya hanya mewakili satu pandangan. Maka tidak ada kemungkinan Anda harus memanggil postData () dua kali berturut-turut. Bahkan jika Anda memanggil, cara postData menanganinya untuk Anda adalah apa yang juga Anda harapkan (menampilkan data terbaru untuk Anda dalam tampilan). Semuanya berjalan dengan baik pada tempatnya.
sumber