You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

验证步骤

  1. 先把recentWrong的初始化改好,确保统计逻辑本身没问题;
  2. 检查Question类的字段权限,保证Gson能序列化recentAnswer;
  3. 替换apply为commit,避免异步保存的延迟问题。

按这几步改完,应该就能正确读取到更新后的布尔值了!

内容的提问来源于stack exchange,提问作者Luca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:37:42