onSharedPreferenceChanged多次调用....为什么?

时间:2011-04-14 07:07:47

标签: android

我有一个首选项Activity,首先当我有机会获得首选项时,onPreferenceChange会按预期触发一次。

然而,经过一段时间(进行不同的活动等)后,onPreferenceChange被调用两次。

我在调试器中看到mListeners的WeakHashMap在开头是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;
}

2 个答案:

答案 0 :(得分:14)

您已将unregisterOnSharedPreferenceChangeListener()放入onDestroy()并且未在所有活动重启时调用。

查看activity lifecycle diagram。结论是,正确的方法是将registerOnSharedPreferenceChangeListener()unregisterOnSharedPreferenceChangeListener()分别放入onResume()onPause()

答案 1 :(得分:1)

这不是LiveWallpaper的任何机会吗?听起来像你有两个同一个类运行的实例(I.E.LiveWallpaper本身以及预览,因为你在设置中)。如果它们似乎立即发生在彼此之上并且没有延迟,那么你很可能会有同样的聆听者跑两次。