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

  • EvilControllers

    EvilControll

    20 Ocak 2008
  • Snazzy Labs

    Snazzy Labs

    9 Aralık 2008
  • YEAH1TV

    YEAH1TV

    19 ŞUBAT 2009