#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, а также предварительный просмотр, потому что вы находитесь в настройках). Если кажется, что они происходят мгновенно друг над другом и задержки нет, то, скорее всего, у вас дважды запущен один и тот же прослушиватель.