Dengan dirilisnya Gingerbread, saya telah bereksperimen dengan beberapa API baru, salah satunya adalah StrictMode .
Saya perhatikan bahwa salah satu peringatan adalah untuk getSharedPreferences()
.
Ini peringatannya:
StrictMode policy violation; ~duration=1949 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2
dan itu diberikan untuk getSharedPreferences()
panggilan yang dilakukan di UI thread.
Haruskah SharedPreferences
akses dan perubahan benar-benar dibuat dari UI thread?
android
sharedpreferences
android-strictmode
cottonBallPaws
sumber
sumber
Jawaban:
Saya senang Anda sudah memainkannya!
Beberapa hal yang perlu diperhatikan: (dalam bentuk peluru malas)
Mengenai pemuatan, meskipun ...
setelah dimuat, SharedPreferences adalah lajang dan seluruh proses yang di-cache. jadi Anda ingin memuatnya sedini mungkin agar Anda memilikinya di memori sebelum Anda membutuhkannya. (dengan asumsi itu kecil, sebagaimana mestinya jika Anda menggunakan SharedPreferences, file XML sederhana ...) Anda tidak ingin menyalahkannya di masa mendatang beberapa pengguna mengklik tombol.
tetapi setiap kali Anda memanggil context.getSharedPreferences (...), file XML pendukung adalah stat untuk melihat apakah itu berubah, jadi Anda tetap ingin menghindari statistik tersebut selama kejadian UI. Stat biasanya harus cepat (dan sering di-cache), tetapi yaffs tidak memiliki banyak konkurensi (dan banyak perangkat Android berjalan di yaffs ... Droid, Nexus One, dll.) Jadi jika Anda menghindari disk , Anda menghindari terjebak di belakang operasi disk lain dalam penerbangan atau tertunda.
jadi Anda mungkin ingin memuat SharedPreferences selama onCreate () dan menggunakan kembali instance yang sama, menghindari stat.
tetapi jika Anda tetap tidak memerlukan preferensi Anda selama onCreate (), waktu pemuatan itu menunda pengaktifan aplikasi Anda secara tidak perlu, jadi biasanya lebih baik memiliki sesuatu seperti subkelas <SharedPreferences> FutureTask yang memulai utas baru ke .set () nilai subkelas FutureTask. Kemudian cukup cari anggota FutureTask <SharedPreferences> Anda kapan pun Anda membutuhkannya dan .get (). Saya berencana untuk membuat ini gratis di belakang layar di Honeycomb, secara transparan. Saya akan mencoba merilis beberapa kode contoh yang menunjukkan praktik terbaik di bidang ini.
Periksa blog Pengembang Android untuk postingan mendatang tentang subjek terkait StrictMode dalam beberapa minggu mendatang.
sumber
Mengakses preferensi bersama dapat memakan waktu cukup lama karena preferensi tersebut dibaca dari penyimpanan flash. Apakah kamu banyak membaca? Mungkin Anda bisa menggunakan format yang berbeda, misalnya database SQLite.
Tapi jangan perbaiki semua yang Anda temukan menggunakan StrictMode. Atau mengutip dokumentasi:
sumber
Satu kehalusan tentang jawaban Brad: bahkan jika Anda memuat SharedPreferences di onCreate (), Anda mungkin masih harus membaca nilai di thread latar belakang karena blok getString () dll. Hingga membaca preferensi file bersama di selesai (di thread latar belakang):
edit () juga memblokir dengan cara yang sama, meskipun apply () tampaknya aman di thread latar depan.
(BTW maaf untuk meletakkan ini di sini. Saya akan meletakkan ini sebagai komentar untuk jawaban Brad, tapi saya baru saja bergabung dan tidak memiliki reputasi yang cukup untuk melakukannya.)
sumber
Saya tahu ini pertanyaan lama tetapi saya ingin berbagi pendekatan saya. Saya memiliki waktu membaca yang lama dan menggunakan kombinasi preferensi bersama dan kelas aplikasi global:
ApplicationClass:
LocalPreference:
MainActivity (aktivitas yang dipanggil pertama kali dalam aplikasi Anda):
Langkah-langkah menjelaskan:
CATATAN: SELALU periksa apakah variabel lebar aplikasi berbeda dari NULL, alasan -> http://www.developerphil.com/dont-store-data-in-the-application-object/
Jika saya tidak memeriksa null, saya akan mengizinkan nullpointer dilemparkan saat memanggil misalnya getMaxDistance () pada objek filter (jika objek aplikasi digesek dari memori oleh Android)
sumber
Kelas SharedPreferences melakukan beberapa pembacaan & penulisan dalam file XML pada disk, jadi seperti operasi IO lainnya, hal ini dapat memblokir. Jumlah data yang saat ini disimpan di SharedPreferences memengaruhi waktu dan sumber daya yang digunakan oleh panggilan API. Untuk jumlah data minimal, perlu beberapa milidetik (terkadang bahkan kurang dari satu milidetik) untuk mendapatkan / memasukkan data. Tapi dari sudut pandang seorang ahli, mungkin penting untuk meningkatkan kinerja dengan melakukan panggilan API di latar belakang. Untuk SharedPreferences asinkron, saya sarankan untuk memeriksa perpustakaan Datum .
sumber