【问题标题】:Shared Preferences get lost after shutting down device or killing the app关闭设备或终止应用程序后,共享首选项会丢失
【发布时间】:2012-04-05 22:13:02
【问题描述】:

有很多与共享偏好和替代方案相关的问题。 我的问题:当我关闭设备或终止应用程序时,共享首选项会丢失。 请注意,我的代码实际上是在 Acer A500 上运行的。但是在我的摩托罗拉 Xoom MZ604 上它不工作!!

首先,我尝试在 onCreate 中恢复我的 HashSet。这个方法是肯定调用的,并且是单例实现的。

public boolean restoreCollection(Context context){
    SharedPreferences settings = context.getSharedPreferences(context.getString(R.string.restore_values), 0);
    if(settings.getStringSet(context.getString(R.string.collection), null) != null){
        collection = settings.getStringSet(context.getString(R.string.collection), null);
        return true;
    } 
    collection = new HashSet<String>();
    return false;
}

通过调用 onDestroy 我保存了 HashSet。即使没有给出,肯定会调用此方法,但无论如何 Preferences 都会丢失,我试图将其保存在 onPause 中,结果相同。

public void saveCollection(Context context){
    SharedPreferences settings = context.getSharedPreferences(context.getString(R.string.restore_values), 0);
    SharedPreferences.Editor e = settings.edit();
e.putStringSet(context.getString(R.string.collection), collection);
e.commit();
}

Shared Preferences 和 XOOM 设备是否也遇到过任何问题,还是只有我一个?也许我的代码有问题,但数据不会在我的 Acer 平板电脑上丢失。

我也尝试过 PreferenceManager.getDefaultSharedPreferences(context) 来获取 SharedPreferences 的对象

感谢您的帮助, 克里斯

【问题讨论】:

  • 你检查commit的返回值了吗?
  • 好点 - 但不幸的是:真的...
  • 我从未在任何设备上见过这种情况,而且我见过很多(虽然不是平板电脑,只是手机)。既然您自己提到它只发生在 Xoom 上,这可能只是供应商特定的问题吗?
  • 你写过空键吗?请参阅:stackoverflow.com/questions/5368442/…
  • 事实证明这也可能是由无效的首选项键引起的,例如包含换行符的键:stackoverflow.com/questions/28385132/…

标签: android sharedpreferences


【解决方案1】:

我想出了一个既适用于我的 Acer 也适用于我的 XOOM 设备的解决方案:在提交新数据之前,您必须在编辑器上调用 clear():

public void saveCollection(Context context){
    SharedPreferences settings = context.getSharedPreferences(context.getString(R.string.restore_values), 0);
    SharedPreferences.Editor e = settings.edit();
    e.clear();
    e.putStringSet(context.getString(R.string.collection), collection);
    e.commit();
}

【讨论】:

  • 这个解决方案在我的情况下不起作用我有同样的问题,我无法在 Xoom 上的 myLocationService 中获得首选项,但在 Galaxy Pop 上它工作正常。
  • 这当然不是一个解决方案——我的意思是偏好是持久的——如果要清除偏好,大多数用例都会被取消——原因在别处
  • 这可行,但它不是正确的解决方案。见stackoverflow.com/a/31598304/238753
【解决方案2】:

在使用带有 SharedPreferences 的字符串集时,我遇到了完全相同的问题。我发现了为什么会发生这种情况以及如何解决它。

阅读SharedPreferences.getStringSet (String key, Set defValues)的API文档非常重要

基本上不要修改或触摸返回的 Set!如果你这样做了,SharedPreferences 会得到奇怪的结果。 :)

享受吧!

【讨论】:

  • 我同意,但除此之外,我想说的是,何时何地获得字符串是最重要的。请看我的回答:stackoverflow.com/questions/36939380/…
  • 这为我解决了这个问题。真正令人讨厌的是,您可以修改/写回它,并且每当您在应用程序的同一运行期间从首选项中读取时,它会很好地显示更新的值,但只要您重新启动应用程序,它就会恢复为旧值。最令人困惑的调试。
【解决方案3】:

对于运行标准Froyo 2.2.1 的设备Samsung Galaxy S,您的问题似乎与discussed here 相同。他们讨论的一些印象:

日志显示:

01-19 12:08:56.856 W/ApplicationContext(4563):尝试读取首选项文件 /dbdata/databases/com.mobilemerit.ultimatefaves/ shared_prefs/com.mobilemerit.ultimatefaves_preferences.xml 没有 权限

一种可能的解决方法似乎是:

我的用户似乎也有同样的症状。

他给我发电子邮件说他必须对他的手机进行恢复出厂设置,因为 其他原因,他重新安装了市场上的应用程序( 在重置之前没有帮助),现在一切正常。

另一种解决方法:

我的 2.2.1 Galaxy S (root) 也有同样的问题,我解决了 通过删除 \dbdata\databases 中的我的应用程序文件夹 (com.xxx)。做 有人在另一部手机上遇到同样的问题吗?

this guy居然找到了原因:

我安装了我的应用程序 (WidgetLocker),它得到了 app_81,然后我 然后使用“adb uninstall com.teslacoilsw.widgetlocker”卸载 重新安装后发现我的偏好一直存在 卸载,但没有权限被拒绝错误。我又卸载了 同样,这次我去 Market 安装了 Androidify。 这是事情变得有趣的时候:(...)

所以 Androidify 得到了我的uid,我的偏好现在属于 他们。 (...)

我们被搞砸了……

有一个关于这个问题的错误报告:http://code.google.com/p/android/issues/detail?id=14359

Google 拒绝了该错误,因为它实际上是由供应商对设备进行的修改引起的错误。

“Beautiful Widgets”应用程序的作者向其用户提供以下建议:

** SAMSUNG GALAXY S & ANDROID 2.2 **
三星更新中存在阻止保存设置文件的错误。你需要工厂 重置您的手机 (...)

所以这应该会有所帮助。

如果在您的 Xoom 设备上遇到同样的问题,请回复此答案。

【讨论】:

猜你喜欢
  • 2012-11-17
  • 1970-01-01
  • 2011-12-18
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
相关资源
最近更新 更多