SharedPreferences无法保存对象布尔属性问题求助
问题排查与修复方案
我帮你梳理下为啥读不到更新后的recentAnswer值,主要有几个关键点需要调整:
1. 先解决统计变量的低级错误
你在Activity2里定义的recentWrong没有显式初始化!Java里局部变量不会自动赋默认值,直接用的话要么编译报错,要么得到一个不确定的初始值,根本没法正确统计错误数量。
修复后的代码:
// 一定要显式初始化为0,不然统计逻辑完全无效 int recentWrong = 0; for (Question element : questions){ if (!element.recentAnswer){ recentWrong++; } }
2. 核心问题:Gson没正确序列化recentAnswer字段
如果上面改了还是不行,那大概率是你的Question类出了问题——Gson默认只会序列化public修饰的字段。如果recentAnswer是private的,Gson根本不会把它写到JSON里,自然读出来的就是默认值false(或者你类里的初始值)。
正确的Question类写法示例:
public class Question { // 要么把字段设为public,让Gson能直接访问 public boolean recentAnswer; // 其他字段比如answer1也要保证能被Gson序列化 public String answer1; // 构造方法、其他业务方法... }
如果不想把字段设为public,也可以给private字段加@SerializedName注解:
public class Question { @SerializedName("recentAnswer") private boolean recentAnswer; // 记得提供getter/setter,或者让Gson能访问私有字段(可以用GsonBuilder配置,但public更简单) }
3. 异步保存的延迟坑
你用的editor.apply()是异步写入磁盘的,如果在调用saveData()后立刻跳转到Activity2,可能数据还没写完就去读了,自然拿到的是旧值。换成同步的commit()就能确保数据立即保存:
修改Activity1的saveData方法:
private void saveData(){ SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); Gson gson = new Gson(); String json = gson.toJson(questions); editor.putString("task list", json); // 用commit()替代apply(),同步写入磁盘 editor.commit(); }
验证步骤
- 先把
recentWrong的初始化改好,确保统计逻辑本身没问题; - 检查Question类的字段权限,保证Gson能序列化
recentAnswer; - 替换apply为commit,避免异步保存的延迟问题。
按这几步改完,应该就能正确读取到更新后的布尔值了!
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

