android sharedpreferences中的<String>在强制关闭时不保存该怎么解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

我试图使用androids sharedpreferences,我已经记录了一切,下面的代码真的提交了字符串集。问题是当我强制关闭应用程序并重新启动时,settings.getStringSet返回一个空集。没有任何错误消息。

我试过PreferenceManager.getDefaultSharedPreferences,但这对我也不起作用:

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();

}
提问于
用户回答回答于

这里有一个错误,请看这里。从那里摘录:

这个问题在17 API级别上仍然存在。 这是因为SharedPreferences类的getStringSet()方法没有返回Set对象的副本:它返回整个对象,并且在向它添加新元素时,SharedPrefencesImpl.EditorImpl类的commitToMemory方法会看到现有值等于先前存储的值。 解决此问题的方法是制作SharedPreferences.getStringSet返回的Set的副本,或者使用其他首选项(通常会更改)强制写入内存(例如,每次存储集合大小的属性)

用户回答回答于

你也可以这样解决g00dy提到的bug:

从sharedPreferences获取该集合并将其保存在一个变量中。

然后只需在保存时再次添加sharedpreferences中的设置即可:

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

扫码关注云+社区