默认SharedPreferences跨Activity不共享,传递字符串集合异常求助
嘿,我来帮你搞定这个头疼的问题!首先得纠正你的一个误解:PreferenceManager.getDefaultSharedPreferences()生成的是全局的SharedPreferences实例,所有Activity用这个方法拿到的都是同一个文件,根本不存在每个Activity独立文件的情况。你遇到的保存后提取只有部分集合的问题,其实是SharedPreferences处理StringSet的一个经典坑。
问题根源
当你调用getStringSet()时,SharedPreferences返回的Set对象是它内部存储的直接引用,而不是一个独立的副本。如果你直接修改这个返回的Set(比如usersSet.add(id))再存回去,SharedPreferences大概率检测不到集合的变化——因为它是通过对比对象引用或者浅层次检查来判断是否需要更新的,这就导致你的修改没有被完整持久化,提取时自然只能拿到部分数据。
解决方案
核心思路就是:永远不要直接操作getStringSet()返回的集合,每次都先创建一个新的副本,修改副本后再存入SharedPreferences。
修改你的保存代码如下:
SharedPreferences appPrefernces = PreferenceManager.getDefaultSharedPreferences(ctx); SharedPreferences.Editor appEditor = appPrefernces.edit(); // 关键:创建返回集合的副本,避免操作原引用 Set<String> usersSet = new HashSet<>(appPrefernces.getStringSet("users", new HashSet<String>())); if(!usersSet.contains(id)) { usersSet.add(id); appEditor.putStringSet("users", usersSet); appEditor.apply(); }
提取代码也建议做同样的处理(防止后续误操作原引用导致问题):
SharedPreferences appPrefernces = PreferenceManager.getDefaultSharedPreferences(Main.this); // 复制一份集合到新的HashSet中 users = new HashSet<>(appPrefernces.getStringSet("users", new HashSet<String>()));
这样修改后,每次修改的都是独立的集合副本,存入时SharedPreferences能明确识别到集合的变化,就能完整保存所有数据了。
内容的提问来源于stack exchange,提问作者sleeman nabwani
相关产品推荐
相关产品推荐

