android sharedpreferences中的<String>在强制closures时不保存

我试图使用android的sharedpreferences,我已经logging了一切,下面的代码真的提交string集。 问题是当我强制closures应用程序并重新启动时,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(); } 

Solutions Collecting From Web of "android sharedpreferences中的<String>在强制closures时不保存"

看看这里 。

也供参考:

SharedPreferences

SharedPreferences.Editor

编辑:

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

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

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

解决此问题的方法是制作由SharedPreferences.getStringSet返回的Set的副本,或使用其他首选项(通常每次都会存储该大小的属性)强制写入内存,

EDIT2:

这里可能有解决办法,请看看。

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

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

然后在保存之前再次添加sharedpreferences中的设置。

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

确保使用apply()或commit()两次。