SharedPreferences 未保存在 onPause 方法中

Posted

技术标签:

【中文标题】SharedPreferences 未保存在 onPause 方法中【英文标题】:SharedPreferences not saving in onPause method 【发布时间】:2017-07-10 15:02:24 【问题描述】:

我在 onPause 方法中保存布尔值的状态。我已经尝试使用 editor.apply() 和 editor.commit() 但仍然没有保存值。 这是 onPause 方法:

@Override
protected void onPause() 
            SharedPreferences.Editor editor = preferences.edit();
            editor.clear(); //I have tried omitting it
            editor.putBoolean(MUTE_TAG,mute);
            editor.apply(); // I tried editor.commit() but with no effect
            boolean mute1 = preferences.getBoolean(MUTE_TAG,false);
            Log.d(TAG,"Values:\n"+ "mute1 " + mute1 + " mute);
            super.onPause();
        

注意:当我尝试从不同的活动再次访问 SharedPreferences 中的值时,它不会更新。这是设置代码

public static boolean mute;
public static final String PREFS = "prefs";
    init(Context context) 
    preferences = context.getSharedPreferences(PREFS,MODE_PRIVATE);
    mute = preferences.getBoolean(MUTE_TAG,false);
        

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
            Log.d(TAG,"MUTE PRESSED");
            mute = isChecked;
            break;

【问题讨论】:

不,preferences = context.getSharedPreferences(PREFS,MODE_PRIVATE); mute = preferences.getBoolean(MUTE_TAG,false); 去掉 clear 并在开头调用 super.onPause() 。如果你使用 apply() 或 commit() 在你的情况下并不重要。 请告诉我你是如何检索偏好对象的。 public static void init(Context context) preferences = context.getSharedPreferences(PREFS,MODE_PRIVATE); 我希望静音字段是静态的,并从 Application 类调用 init 以使静音是所有类都可以访问的公共静态字段 看编辑的问题 【参考方案1】:

保存后呢? logcat 是否显示当前/预期值?

这对我有用:

之前:private boolean mute = true;,但在将应用程序发送到后台之后。结果证明是真的。而默认值为false;

按原样复制您的代码

唯一的问题:未闭合的字符串文字

    @Override
    protected void onPause() 
        SharedPreferences preferences = getSharedPreferences("SHARED_PREFERENCES_NAME", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();

        mute = !mute ;
        Log.d(TAG, "UPDATED MUTE VALUE :: " + mute);

        editor.clear(); //I have tried omitting it
        editor.putBoolean(MUTE_TAG,mute);
        editor.apply(); // I tried editor.commit() but with no effect
        boolean mute1 = preferences.getBoolean(MUTE_TAG,false);
        Log.d(TAG,"Values:\n"+ "mute:  " + mute1 + " mute");
        super.onPause();
    

解决方案 #2

它连接到这个 What's the difference between commit() and apply() in Shared Preference 。再次尝试使用 commit,commit 将阻止 super.onPause 执行,从而确保它保存

解决方案 #3

您的活动在onCreate 之后调用onPause,从而保存了默认 mute 值。因此,创建一个类并添加将存储静音值的 STATIC PUBLIC /PUBLIC STATIC 变量并仅在销毁活动时保存它。这个静态变量不会跨活动改变它的值

【讨论】:

静音是否总是返回false?如果是这样,最有可能的 onPause 会在其他时间被调用。你能在方法onCheckedChanged中保存静音状态吗?这可能是一个更好的策略,这对性能的影响很小(如果有的话) 它看起来有些随机。有时会颠倒,有时则不会。 尝试将值保存在onCheckedChanged 中。当活动开始时,活动可能正在调用 onPause 原来在preferences.xml 文件中,一次只保存了2 个首选项。这有什么原因吗? 对不起,你什么意思?

以上是关于SharedPreferences 未保存在 onPause 方法中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SharedPreferences 中保存和检索日期

SharedPreferences保存字符串[重复]

使用 SharedPreferences 在 ListView 中保存 ToggleButton 状态

SharedPreferences 不保存布尔属性

为啥我的 LinkedHashMap 被错误地转换为 JSON 并保存在 SharedPreferences 中?

从SharedPreferences保存并检索Intent