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 在 ListView 中保存 ToggleButton 状态