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
相关产品推荐
相关产品推荐

