Android Studio 中新Activity无法保存SharedPreference数据问题
问题根源
你的代码存在两个不符合Android SharedPreferences使用规范的问题,直接导致跨Activity修改不生效:
getStringSet()方法返回的是SharedPreferences内部持有的缓存实例,官方明确禁止直接修改该实例。你直接调用temp.add()修改该实例会触发内部缓存逻辑异常,跨Activity场景下缓存同步会出现错乱。- 主Activity如果提前加载过该
attempt字段对应的StringSet旧值,后续主Activity执行提交操作时会直接用旧值覆盖其他Activity写入的新值,就会出现修改后临时生效、后续被还原的现象。
修复方案
拿到StringSet后先拷贝到新的Set实例中再修改,正确代码如下:
// 读取原有数据,空值时默认返回空HashSet避免空指针 Set<String> originSet = getSharedPreferences("pref", MODE_PRIVATE).getStringSet("attempt", new HashSet<>()); // 拷贝到新的Set实例后再做修改 Set<String> temp = new HashSet<>(originSet); temp.add("one item"); // 提交修改,UI线程建议用异步的apply,需要同步获取提交结果再用commit getSharedPreferences("pref", MODE_PRIVATE).edit() .putStringSet("attempt", temp) .apply();
额外注意事项
- 不要在多个Activity中缓存同一份StringSet实例,每次修改前都重新读取、拷贝、提交,避免多实例修改互相覆盖
- 如果多个页面频繁操作同一份偏好数据,建议封装为单例的SharedPreferences工具类统一处理写入操作,必要时加锁避免并发写入冲突
内容的提问来源于stack exchange,提问作者imamangoo
相关产品推荐
相关产品推荐

