当前位置: 首页 > 知识库问答 >
问题:

在android sharedpreferences中设置<String>不会在强制关闭时保存

姬乐池
2023-03-14

我正在尝试使用android共享首选项,我已经记录了所有内容,下面的代码确实提交了字符串集。问题是当我强制关闭应用程序并重新启动时,settings.getStringSet返回一个空集。任何地方都没有错误消息。

我已经尝试PreferenceManager.get默认共享首选项,但这对我也不起作用。

谢谢你的时间。

public static final String PREFS_NAME = "MyPrefsFile";
private static final String FOLLOWED_ROUTES = "followedRoutes";

稍后调用保存时:

public void onFollowClicked(View view){

SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();

Set<String> follows =  settings.getStringSet(FOLLOWED_ROUTES, new HashSet<String>());
follows.add(routeId);

editor.putStringSet(FOLLOWED_ROUTES, follows);
editor.commit();

}

共有2个答案

西门嘉澍
2023-03-14

看看这里。

也可参考:

共享首选项

SharedPreferences.Editor

编辑:

这个实际上有一个错误,看这里。那里的摘录:

这个问题仍然存在于17 API级别。

这是因为 SharedPreferences 类的 getStringSet() 方法不返回 Set 对象的副本:它返回整个对象,当您向其添加新元素时,SharedPrefencesImpl.EditorImpl 类的 commitToMemory 方法看到现有值等于存储的前一个值。

解决此问题的方法是复制SharedPreferences返回的Set。getStringSet或使用总是更改的其他首选项强制写入内存(例如,每次存储集大小的属性)

编辑2:

这里可能有一个解决方案,看看吧。

干善
2023-03-14

你也可以通过这种方式解决g00dy提到的错误:

从共享首选项获取集合并将其保存在变量中。

然后在保存时再次添加之前,只需删除sharedpreferences中的集合。

SharedPreferences.Editor editor= sharedPref.edit();
editor.remove("mSet");
editor.apply(); 
editor.putStringSet("mSet", mSet);
editor.apply();

确保两次使用应用()或提交()。

或者,如果您在 Kotlin 工作,只需:

PreferenceManager.getDefaultSharedPreferences(applicationContext)
    .edit {
        this.remove("mSet")
        this.apply()
        this.putStringSet("mSet", mSet)
    }
 类似资料:
  • 问题内容: 我已经能够在我的应用程序中成功实现“共享首选项”,但是如果我通过任务管理器杀死该应用程序,就会遇到重置/删除数据的问题。 我使用的是静态方法进行保存,因此我只需要使用一次该方法,就可以在我的应用程序中的任何地方调用它。 一旦我杀死了我的应用程序,我的所有数据都将恢复为SharedPreferences保存方法中的默认设置。 我也进行了一些搜索,发现一些帖子说将android:persi

  • 我在Android系统中遇到了两天的问题..我无法从URL解析HTML页面..我尝试了很多方法,我得到了Jsoup作为简单的方法…这是我的剧本: 但是,当我运行这个脚本时,它变得很接近…我只是不知道有什么问题..我在这里看到了教程:http://jsoup.org/cookbook/input/load-document-from-url 如有任何帮助,我们将不胜感激。

  • 我正在使用SQLcl生成csv输出。 但我得到了我不想要的标题。我认为set heading off应该关闭heading(就像在SQLPlus中一样)为什么它在SQLcl中不工作。如果我清除了sql格式(设置sqlformat),那么标题就行了。它是SQLcl中的一个bug吗?

  • 在我的布局中,有一个用于搜索的EditText,在EditText下面有一个列表。现在我在弹出窗口中放大这个布局。现在我的问题是 1) 如果我将PopupWindow focusable设置为true,则PopupWindow布局以外的所有位置都将不可单击。因此,我不能通过单击外部或单击设备的后退按钮来关闭窗口 2)如果我设置PopupWindow可聚焦假,那么PopupWindow打开和关闭是完

  • 我想用Java强制转换一个值。例如,将布尔值转换为泛型。我之前检查过类型,所以我知道我在做什么。但是编译器不想让我把它转换成。我怎样才能强制施法?

  • 当我使用像或这样的IO类时,Eclipse会显示一个警告。如何使Eclipse在我自己的类未关闭时为它显示此警告? 我想知道的是,是否有一个接口或我需要实现的东西来使我的类被视为IO类,以便它独立于任何一个IDE,例如,命令行在资源未关闭时也会显示警告。