SORU
30 Mart 2010, Salı


SharedPreferences.onSharedPreferenceChangeListener sürekli çağrılan

Bu tercihi değiştirmek gibi bir dinleyici kayıt oldum (onCreate() benim ana etkinlik):

SharedPreferences prefs = 
    PreferenceManager.getDefaultSharedPreferences(this);

prefs.registerOnSharedPreferenceChangeListener(
    new SharedPreferences.OnSharedPreferenceChangeListener() {
        public void onSharedPreferenceChanged(
            SharedPreferences prefs, String key) {

            System.out.println(key);
        }
    });

Sorun dinleyici her zaman çağrılmaz. Ben uygulamayı kaldırıp yeniden kadar bir tercihi değişti ve artık denir ilk birkaç kez çalışır. Uygulamayı yeniden başlatmayı miktarı ne olursa Düzelt gibi görünüyor.

Bir e-posta listesi thread aynı sorun raporlama buldum, ama kimse onu yanıtladı. Neyi yanlış yapıyorum?

CEVAP
23 HAZİRAN 2010, ÇARŞAMBA


Bu sinsi biri. SharedPreferences bir WeakHashMap bir programında tutuyor. Bu çöp toplama hedefi geçerli kapsamı sen gittikten hemen sonra olacak gibi bir dinleyici olarak anonim bir iç sınıf kullanamazsınız anlamına gelir. İlk başta bu iş olacak, ama sonunda, çöp toplama, WeakHashMap kaldırıldı ve çalışmayı durdurur.

Sınıfınızın bir alanda dinleyici için bir başvuru tutun ve OK, sınıf örneği yok değil sağlanacaktır.

yani yerine:

prefs.registerOnSharedPreferenceChangeListener(
  new SharedPreferences.OnSharedPreferenceChangeListener() {
  public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    // Implementation
  }
});

bunu yapmak için:

// Use instance field for listener
// It will not be gc'd as long as this instance is kept referenced
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
  public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    // Implementation
  }
};

prefs.registerOnSharedPreferenceChangeListener(listener);

Nedeni onDestroy metodu kaydını sorun bir alanda dinleyici, bu yüzden sorun önlemek kaydetmek zorunda olduğun için yapmak olmasıdır giderir. Bu kaydetme sorunu, onDestroy içinde kaydını değil giderdiği bir alan dinleyici.

GÜNCELLEME: Android docs bu davranış hakkında warnings updated olmuştur. Yani, tuhaf davranış kalır. Ama şimdi belgelenmiş oldu.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jeb Corliss

    Jeb Corliss

    17 Kasım 2006
  • Madeon

    Madeon

    31 Ocak 2010
  • ParryGripp

    ParryGripp

    12 AĞUSTOS 2006