onSharedPreferenceChanged вызывался несколько раз …. почему?

#android

#Android

Вопрос:

У меня есть действие с предпочтениями, сначала, когда я выбираю предпочтение, onPreferenceChange запускается один раз, как и ожидалось.

Однако через некоторое время (переход к различным действиям и тому подобное) onPreferenceChange вызывается дважды.

Я вижу в отладчике, что WeakHashMap для mListeners вначале равен 1, а затем становится больше 1, но не уверен, почему?

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getPrefs();
    int preferencesResource = 0; // R.xml.preferences;
    preferencesResource = getResources().getIdentifier("pref", "xml",
            getPackageName());
    addPreferencesFromResource(preferencesResource);
    listener = new SharedPreferences.OnSharedPreferenceChangeListener() {

        @Override
        public void onSharedPreferenceChanged(SharedPreferences arg0,
                String arg1) {
            // Why is this called once then sometimes twice!!
            Log.i("PreferencesActivity", "OnPreferenceChanged()");
        }
    };
    prefs.registerOnSharedPreferenceChangeListener(listener);
}

protected void onDestroy() {
    super.onDestroy();
    listener = null;
    prefs.unregisterOnSharedPreferenceChangeListener(listener);
    prefs = null;
}

public Preferences getPrefs() {
    if (prefs == null) prefs = new Preferences(this);
    return prefs;
}
  

Комментарии:

1. Вы, конечно, имеете в виду prefs.unregisterOnSharedPreferenceChangeListener(listener);listener = null; — то, как у вас это называется prefs.unregisterOnSharedPreferenceChangeListener(null);

Ответ №1:

Вы поместили unregisterOnSharedPreferenceChangeListener() в onDestroy() , и это не вызывается при всех перезапусках активности.

Посмотрите на диаграмму жизненного цикла активности. Вывод заключается в том, что правильный способ сделать это — поместить registerOnSharedPreferenceChangeListener() и unregisterOnSharedPreferenceChangeListener() в onResume() и onPause() соответственно.

Комментарии:

1. Но это не отвечает, почему его вызывают дважды. В соответствии с Activity жизненным циклом, onCreate может быть вызван только один раз. Как к нему подключается прослушиватель предпочтений, если процесс приложения был прерван??

2. У меня такая же проблема, что «onSharedPreferenceChanged» вызывается дважды, и у меня есть reg / unreg прослушивателя в правильном месте

3. onResume() И onPause() также не гарантируют этого, поскольку известно, что при некоторых обстоятельствах onResume() может вызываться дважды.

Ответ №2:

Это случайно не для LiveWallpaper, не так ли? Мне кажется, что у вас запущено два экземпляра одного и того же класса (т.Е. сам LiveWallpaper, а также предварительный просмотр, потому что вы находитесь в настройках). Если кажется, что они происходят мгновенно друг над другом и задержки нет, то, скорее всего, у вас дважды запущен один и тот же прослушиватель.