共享首选项在应用程序被终止时不保存 StringSet(这是一项功能)

Mik*_*keL 2 android sharedpreferences android-sharedpreferences

我一直在加载并将 a 保存Set<String>到 Android 上SharedPreferences,它似乎工作正常,直到我测试了杀死它application并意识到未保存字符串集。

Set<String> stringSet = sharedPreferences.getStringSet(Constants.PREF_SHOULD_LOAD_SET, null);
if (stringSet != null) {
    if (stringSet.contains(data)) {
        stringSet.remove(data);
    } else {
        stringSet.add(data);
    }
    ...
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putStringSet(Constants.PREF_SHOULD_LOAD_SET, stringSet);
    editor.apply();
}
Run Code Online (Sandbox Code Playgroud)

我尝试过的一些事情:

  • 使用提交(而不是应用)
  • 查看其他可能改变价值的地方
  • 调试并查看值是否已保存

Mik*_*keL 6

经过一些不成功的搜索后,我发现了这一点- 其他人也遇到了同样的问题。
他通过删除该值并再次添加它来解决此问题。
进一步阅读对他的帖子的评论揭示了原因,这是sharedPreferences.getStringSet文档:

请注意,您不得修改此调用返回的 set 实例。如果您这样做,则无法保证存储数据的一致性,也无法保证您修改实例的能力。

所以我采取了一个稍微不同的方法,并创建了一个新的集合如下:

if (loadSubSet != null) {
    loadSubSet = new HashSet<>(loadSubSet);
...
Run Code Online (Sandbox Code Playgroud)