【问题标题】:Android onSharedPreferenceChanged triggered before commit has finishedAndroid onSharedPreferenceChanged 在提交完成之前触发
【发布时间】:2014-11-01 03:05:32
【问题描述】:

我有一个非常标准的PreferenceFragment 使用

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.settings);

    prefs = getPreferenceScreen().getSharedPreferences();
}

 @Override
public void onResume() {
    super.onResume();
    prefs.registerOnSharedPreferenceChangeListener(this);

    updatePreferences(getPreferenceScreen());
}

@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    Log.d(TAG, "onSharedPreferenceChanged " + key);
    updatePreference(findPreference(key));
}

@Override
public void onPause() {
    super.onPause();
    prefs.unregisterOnSharedPreferenceChangeListener(this);
}

在 settings.xml 中,我引用了一个 DialogPreference,它看起来像这样:

@Override
protected void onDialogClosed(boolean ok) {
    super.onDialogClosed(ok);

    if (ok) {
        Log.d(TAG, "onDialogClosed OK");

        SharedPreferences.Editor editor = settings.edit();
        editor.putString(SettingKeys.SOME_KEY, X);
        final boolean commit = editor.commit();
        Log.d(TAG, "onDialogClosed commit: " + commit);
    }
}

但是,我得到以下序列:

onDialogClosed OK
onSharedPreferenceChanged SOME_KEY
onDialogClosed commit: true

这意味着,onSharedPreferenceChanged 事件在最终提交完成之前触发。这意味着我的 PreferenceFragment 无法读取 onSharedPreferenceChanged 处理程序中的最新值......这让我发疯。

有什么建议吗?

【问题讨论】:

    标签: android event-handling sharedpreferences commit


    【解决方案1】:

    除非我遗漏了什么,否则您的顺序实际上是正确的:

    1. “onDialogClosed OK”是第一个打印输出
    2. 然后你得到你的编辑器,设置一些键
    3. 您正在调用 editor.commit()。 When a shared preference is changed, added, or removed,onShared onSharedPreferenceChanged() 被触发,然后打印您的第二行:“onSharedPreferenceChanged SOME_KEY”。
    4. 提交后,剩余的行打印“onDialogClosed commit: true”

    【讨论】:

    • 但注册 onSharedPreferenceChanged 的​​代码不会读取最新值,而是读取预提交值
    • findPreference 只是 PreferenceFragment 的。 updatePreference 只是在沿着 pref.setSummary((pref.getValue() == null) ? "-" : pref.getEntry()) 做一些事情。所以我的代码总是在读取预提交值...
    • 似乎 PreferenceFragment 总是绑定到默认的 SharedPreferences。我使用单例方法重写了我的设置,以始终对 ApplicationContext 的 DefaultSharedPreferences 进行操作。这似乎解决了我的问题。 Android的行为真的很挑剔……
    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2014-07-05
    相关资源
    最近更新 更多