【问题标题】:SharedPreferences not working properlySharedPreferences 无法正常工作
【发布时间】:2013-05-01 12:19:26
【问题描述】:

请看下面的代码

@Override
protected void onStop() {
    super.onStop();
    SharedPreferences prefs = getSharedPreferences("screenPref", Context.MODE_PRIVATE);
    SharedPreferences.Editor edit = prefs.edit();
    edit.putString("active_screen", activeScreenText);

    if(edit.commit()){

        Log.i("APP", "SAVED!!"); // LOGCAT Always execute this piece of code

    }
}


// onCreate
SharedPreferences pref = getSharedPreferences("screenPref", Context.MODE_PRIVATE);
    activeScreen.setSummary(pref.getString("active_screen", "Never"));

当用户从 ListPreference 中选择一个选项时,该选项将保存在“activeScreenText”变量中。如果我重新启动应用程序(主页按钮,然后导航回它),它会完美运行。加载字符串并设置此首选项的摘要。但是如果 android 杀死了我的应用程序(或者如果我强制关闭它),那么这种变化不会持久。每次我的应用程序内存不足时,我都会得到“从不”,但相应的列表首选项保持相同的值。

(我在 listpreference 中的选项很少,我想设置摘要,当前选择哪个值。)

例如:

列表首选项: -绝不 -选择1 -选择2 -选择3

假设我选择 Choice3。 当我选择值时,摘要设置正确。如果我退出应用程序并重新启动它,它会加载完美。如果我的应用程序被 android 强制关闭或杀死,则仍然选择 Choice3,但我的摘要值是默认值 ( Never )。

我做错了什么?

【问题讨论】:

  • if(edit.commit()){ ,这里看不懂
  • 这只是检查..如果 commit() 实际上保存了首选项...确实如此。我可以只用“edit.commit()”省略这段代码,它的执行方式是一样的。

标签: java android sharedpreferences


【解决方案1】:

在编辑后立即将您的值保存到 sharedpreferences,而不是在 onStop() 方法中

【讨论】:

  • 谢谢。它工作完美。你能解释一下为什么会发生这种情况(甚至调用了 onStop )
【解决方案2】:

OnStop()不保证会被调用。永远不要依赖它来保存重要数据。正如文档所说:

请注意,在内存不足的情况下,可能永远不会调用此方法 系统没有足够的内存来保存您的活动 在调用其 onPause() 方法后运行的进程。

另外,你为什么每次都以这种方式保存偏好?当用户与之交互时保存它或关注Android's settings pattern

【讨论】:

    【解决方案3】:

    您可以尝试将onStop() 代码移动到onPause() 事件。也许这会解决你的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 2016-09-01
      • 2012-07-11
      • 2018-04-08
      • 2017-04-20
      • 2018-10-02
      相关资源
      最近更新 更多