Saya mendaftarkan pendengar perubahan preferensi seperti ini (di onCreate()
aktivitas utama saya):
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefs.registerOnSharedPreferenceChangeListener(
new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(
SharedPreferences prefs, String key) {
System.out.println(key);
}
});
Masalahnya adalah, pendengar tidak selalu dipanggil. Ini berfungsi untuk beberapa kali pertama preferensi diubah, dan kemudian tidak lagi dipanggil sampai saya menghapus dan menginstal ulang aplikasi. Tampaknya tidak ada jumlah memulai ulang aplikasi untuk memperbaikinya.
Saya menemukan utas milis melaporkan masalah yang sama, tetapi tidak ada yang benar-benar menjawabnya. Apa yang saya lakukan salah?
sumber
jawaban yang diterima ini ok, karena bagi saya itu membuat contoh baru setiap kali aktivitas dilanjutkan
jadi bagaimana menyimpan referensi ke pendengar dalam aktivitas
dan di onResume dan onPause Anda
ini akan sangat mirip dengan apa yang Anda lakukan kecuali kami mempertahankan referensi keras.
sumber
super.onResume()
sebelumnyagetPreferenceScreen()...
?super.onResume()
diperlukan ATAU menggunakannya SEBELUMgetPreferenceScreen()
diharuskan? karena saya sedang berbicara tentang tempat yang BENAR. cs.dartmouth.edu/~campbell/cs65/lecture05/lecture05.htmlthis
dan tidaklistener
, itu menyebabkan kesalahan dan saya bisa menyelesaikan masalah saya. Btw kedua metode ini sekarang sudah umum, tidak dilindungiKarena ini adalah halaman paling detail untuk topik yang ingin saya tambahkan 50ct saya.
Saya punya masalah yang tidak dipanggil OnSharedPreferenceChangeListener. Preferensi Berbagi Saya diambil pada awal Kegiatan utama dengan:
Kode PreferenceActivity saya pendek dan tidak melakukan apa pun kecuali menunjukkan preferensi:
Setiap kali tombol menu ditekan, saya membuat PreferenceActivity dari Kegiatan utama:
Perhatikan bahwa mendaftarkan OnSharedPreferenceChangeListener perlu dilakukan SETELAH membuat PreferenceActivity dalam kasus ini, kalau tidak Handler dalam Kegiatan utama tidak akan dipanggil !!! Aku butuh waktu yang manis untuk menyadari bahwa ...
sumber
Jawaban yang diterima menciptakan
SharedPreferenceChangeListener
setiap kalionResume
dipanggil. @Samuel menyelesaikannya dengan membuatSharedPreferenceListener
anggota kelas Activity. Tapi ada solusi ketiga dan lebih langsung yang digunakan Google dalam codelab ini . Buat kelas aktivitas Anda mengimplementasikanOnSharedPreferenceChangeListener
antarmuka dan menimpaonSharedPreferenceChanged
dalam Aktivitas, secara efektif menjadikan Aktivitas itu sendiri aSharedPreferenceListener
.sumber
Kode Kotlin untuk register SharedPreferenceChangeListener mendeteksi ketika perubahan akan terjadi pada kunci yang disimpan:
Anda dapat meletakkan kode ini di onStart (), atau di tempat lain .. * Pertimbangkan yang harus Anda gunakan
atau kode Anda di dalam blok "// Do Something" akan dijalankan secara salah untuk setiap perubahan yang akan terjadi pada kunci lain di sharedPreferences
sumber
Jadi, saya tidak tahu apakah ini benar-benar akan membantu siapa pun, itu menyelesaikan masalah saya. Meskipun saya telah menerapkan
OnSharedPreferenceChangeListener
seperti yang dinyatakan oleh jawaban yang diterima . Namun, saya masih memiliki ketidakkonsistenan dengan pendengar yang dipanggil.Saya datang ke sini untuk memahami bahwa Android baru saja mengirimkannya untuk pengumpulan sampah setelah beberapa waktu. Jadi, saya melihat kode saya. Sayang saya, saya belum menyatakan pendengar secara global melainkan di dalam
onCreateView
. Dan itu karena saya mendengarkan Android Studio memberitahu saya untuk mengubah pendengar menjadi variabel lokal.sumber
Masuk akal bahwa pendengar disimpan dalam WeakHashMap.Karena sebagian besar waktu, pengembang lebih suka menulis kode seperti ini.
Ini mungkin tampak tidak buruk. Tetapi jika wadah OnSharedPreferenceChangeListeners 'bukan WeakHashMap, itu akan sangat buruk. Jika kode di atas ditulis dalam sebuah Aktivitas. Karena Anda menggunakan kelas dalam non-statis (anonim) yang secara implisit akan memegang referensi instance terlampir. Ini akan menyebabkan kebocoran memori.
Terlebih lagi, jika Anda menyimpan pendengar sebagai bidang, Anda bisa menggunakan registerOnSharedPreferenceChangeListener di awal dan panggil unregisterOnSharedPreferenceChangeListener pada akhirnya. Tetapi Anda tidak dapat mengakses variabel lokal dengan metode di luar cakupannya. Jadi Anda hanya memiliki kesempatan untuk mendaftar tetapi tidak ada kesempatan untuk membatalkan registrasi pendengar. Dengan demikian menggunakan WeakHashMap akan menyelesaikan masalah. Ini adalah cara yang saya rekomendasikan.
Jika Anda menjadikan instance pendengar sebagai bidang statis, ini akan menghindari kebocoran memori yang disebabkan oleh kelas dalam yang tidak statis. Tetapi karena pendengarnya bisa banyak, itu harus terkait dengan contoh. Ini akan mengurangi biaya penanganan panggilan balik onSharedPreferenceChanged .
sumber
Saat membaca data yang dapat dibaca Word dibagikan oleh aplikasi pertama, kita harus
Menggantikan
dengan
di aplikasi kedua untuk mendapatkan nilai yang diperbarui di aplikasi kedua.
Tapi tetap saja tidak berfungsi ...
sumber