Saya menggunakan SharedPreferences
di aplikasi android saya. Saya menggunakan keduanya commit()
dan apply()
metode dari preferensi bersama. Ketika saya menggunakan AVD 2.3 itu tidak menunjukkan kesalahan, tetapi ketika saya menjalankan kode di AVD 2.1, apply()
metode menunjukkan kesalahan.
Jadi apa bedanya keduanya? Dan hanya dengan menggunakan commit()
saya dapat menyimpan nilai preferensi tanpa masalah?
android
sharedpreferences
Andro Selva
sumber
sumber
apply()
asynchronous melakukan disk I / O sementaracommit()
sinkron. Jadi Anda benar-benar tidak boleh meneleponcommit()
dari utas UI.apply()
menang. Oleh karena itu, Anda dapat menggunakanapply()
sebagai pengganticommit()
dengan aman jika Anda memastikan hanya satu SharedPreferences.Editor sedang digunakan oleh aplikasi Anda.commit()
?Jawaban:
apply()
ditambahkan pada 2.3, ia melakukan tanpa mengembalikan boolean yang menunjukkan keberhasilan atau kegagalan.commit()
mengembalikan true jika save berfungsi, false sebaliknya.apply()
ditambahkan ketika tim pengembang Android memperhatikan bahwa hampir tidak ada yang memperhatikan nilai pengembalian, jadi aplikasinya lebih cepat karena asinkron.http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply ()
sumber
tl; dr:
commit()
menulis data secara sinkron (memblokir utasnya dari mana). Ini kemudian memberi tahu Anda tentang keberhasilan operasi.apply()
menjadwalkan data yang akan ditulis secara tidak sinkron . Itu tidak memberi tahu Anda tentang keberhasilan operasi.apply()
dan segera membaca melalui metode getX apa pun, nilai baru akan dikembalikan!apply()
di beberapa titik dan itu masih dieksekusi, panggilan apa pun untukcommit()
akan diblokir sampai semua panggilan-lalu melewati dan panggilan -komit saat ini selesai.Informasi lebih mendalam dari SharedPreferences. Dokumentasi Pendukung :
sumber
apply()
tidak sinkron dan menunggu penulisan memblokir panggilan selanjutnyacommit()
.Saya mengalami beberapa masalah dalam menggunakan apply (), bukan commit (). Seperti yang dinyatakan sebelumnya dalam respons lain, apply () asynchronous. Saya mendapatkan masalah bahwa perubahan yang dibentuk untuk preferensi "string set" tidak pernah ditulis ke memori persisten.
Itu terjadi jika Anda "memaksa penahanan" dari program atau, dalam ROM yang telah saya instal pada perangkat saya dengan Android 4.1, ketika prosesnya terbunuh oleh sistem karena kebutuhan memori.
Saya sarankan untuk menggunakan "commit ()" sebagai gantinya "apply ()" jika Anda ingin preferensi Anda tetap hidup.
sumber
Gunakan apply ().
Itu menulis perubahan ke RAM segera dan menunggu dan menulisnya ke penyimpanan internal (file preferensi aktual) setelah. Komit menulis perubahan secara sinkron dan langsung ke file.
sumber
commit()
sinkron,apply()
asinkronapply()
adalah fungsi batal.commit()
mengembalikan true jika nilai-nilai baru berhasil ditulis ke penyimpanan persisten.apply()
jaminan selesai sebelum beralih status, Anda tidak perlu khawatir tentang siklus komponen AndroidJika Anda tidak menggunakan nilai yang dikembalikan dari
commit()
dan Anda menggunakancommit()
dari utas utama, gunakanapply()
sebagai ganticommit()
sumber
Dokumen memberikan penjelasan yang cukup bagus tentang perbedaan antara
apply()
dancommit()
:sumber
Dari javadoc:
sumber
Kita mungkin bingung dengan kedua istilah itu, ketika kita menggunakan SharedPreference. Pada dasarnya mereka mungkin sama, jadi mari kita perjelas perbedaan commit () dan apply ().
apply()
berkomitmen tanpa mengembalikan boolean yang menunjukkan keberhasilan atau kegagalan.commit(
) mengembalikan true jika save berfungsi, false sebaliknya.apply()
lebih cepat.commit()
lebih lambat.apply()
: Asynchronouscommit()
: Synchronousapply()
: atomcommit()
: atomapply()
: Tidakcommit()
: Yasumber
apply()
"lebih cepat" daripadacommit()
? Mereka pada dasarnya mewakili tugas yang sama yang akan dimasukkan ke dalam Looper dari utas.commit()
menempatkan tugas itu di Looper utama sambilapply()
membawanya di latar belakang, sehingga menjaga looper utama bebas dari tugas I / O disk.