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

Android SharedPreferences存储Bug:所有保存值相同问题排查

问题根因

你定义的所有SharedPreferences存储键常量都被赋值为相同的字符串"0",所有读写操作实际都在操作同一个存储键,最后一次写入的值会直接覆盖之前的所有写入内容,读取时所有变量拿到的也都是这个唯一键下的存储值,才会出现“最后写入哪个计数值,重启后所有项就全显示哪个值”的现象。

修复方案
  • 先修正键名常量定义,给每个计数项分配全局唯一的键名字符串,禁止重复:
public static String SHARED_PREFS = "sharedPrefs";
// 每个存储key必须唯一,不能全赋值为"0"
public static String F_COUNT = "f_count";
public static String Z_COUNT = "z_count";
public static String A_COUNT = "a_count";
public static String M_COUNT = "m_count";
public static String I_COUNT = "i_count";
  • 去掉冗余的字符串类型转换逻辑:SharedPreferences原生支持整型数据的存取,直接调用putInt()、getInt()方法即可,既简化代码,也能避免字符串解析带来的异常风险。
    优化后的存取代码如下:
public void saveData(){
    sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
    editor = sharedPreferences.edit();
    // 直接存储整型值
    editor.putInt(F_COUNT, fCount);
    editor.putInt(Z_COUNT, zCount);
    editor.putInt(I_COUNT, iCount);
    editor.putInt(M_COUNT, mCount);
    editor.putInt(A_COUNT, aCount);
    editor.apply();
}

public void loadData(){
    SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
    // 直接读取整型值,第二个参数为key不存在时返回的默认值
    fCount = sharedPreferences.getInt(F_COUNT, 0);
    zCount = sharedPreferences.getInt(Z_COUNT, 0);
    aCount = sharedPreferences.getInt(A_COUNT, 0);
    iCount = sharedPreferences.getInt(I_COUNT, 0);
    mCount = sharedPreferences.getInt(M_COUNT, 0);
}
额外优化建议
  • 不要将计数变量、SharedPreferences/Editor实例声明为static:静态变量生命周期长于Activity实例,容易引发内存泄漏,也可能在应用被系统后台回收后出现状态异常,作为普通成员变量使用即可。
  • 将findViewById控件查找逻辑移到onCreate中执行一次即可,不需要每次调用updateViews()时重复查找控件,减少无意义的性能开销。
  • 补全数据保存触发时机:不要仅在应用主动退出时调用saveData(),建议在onPause()生命周期中也触发一次保存,避免应用被系统异常强杀时出现计数数据丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:15:30