首次从其他Activity读取SharedPreference数据时遇空指针异常及取值失败
嘿,我之前也踩过一模一样的坑!这种“首次读不到、第二次进去就正常”的情况,大概率是SharedPreferences的写入时机或者读写逻辑的一致性出了问题,咱们一步步拆解解决:
1. 优先排查:写入时用了异步的apply(),导致跳转时还没写完
如果你在保存JSON响应时用的是editor.apply(),那要注意——这是个异步方法!它会把修改放到后台线程去执行,如果你写完立刻跳转到目标Activity,很可能此时数据还没真正写入到磁盘文件里,自然读不到;而第二次进入时,后台的异步写入早就完成了,所以能拿到值。
解决办法:如果需要确保数据保存完成后再跳转,改用同步写入的editor.commit(),它会阻塞当前线程直到写入完成(放心,保存少量JSON字符串这种操作不会卡主线程的):
// 写入SharedPreferences的代码示例 SharedPreferences sp = getSharedPreferences("你的SP文件名", MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.putString("saved_json", jsonResponse); // 用commit替代apply,同步写入并返回是否成功 boolean saveSuccess = editor.commit(); if (saveSuccess) { // 确认保存成功后,再跳转到目标Activity startActivity(new Intent(this, 你要跳转的Activity.class)); }
2. 检查读取逻辑的时机和正确性
确认目标Activity里的读取代码是在合适的时机执行(比如onCreate()里),并且和写入时的SP实例完全一致:
// 目标Activity的读取代码示例 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_目标页面); // 必须和写入时用同一个文件名、同一个模式! SharedPreferences sp = getSharedPreferences("你的SP文件名", MODE_PRIVATE); String jsonData = sp.getString("saved_json", null); if (jsonData != null) { // 正常处理数据 } else { // 首次读取为空的兜底处理(比如提示用户或者重新请求数据) } }
3. 确认SharedPreferences的名称和模式完全一致
这是很容易忽略的小细节:
- 写入和读取的SP文件名必须完全相同(比如都是
"AppDataSP",大小写也要一致) - 模式必须一致(比如都是
MODE_PRIVATE,不能一个用MODE_PRIVATE一个用MODE_WORLD_READABLE) - 别把
getSharedPreferences()和getPreferences()搞混:后者是当前Activity专属的SP,和全局的SP不是同一个文件!
4. 极端情况:磁盘缓存延迟(很少见)
如果上面的方法都试过还是不行,极少数情况下可能是系统磁盘缓存的延迟,可以尝试在写入后主动触发文件同步,但这个操作一般没必要,commit()已经足够保证写入完成了。
总结一下:90%以上的概率是apply()的异步写入导致的,换成commit()并确认保存成功后再跳转,基本就能解决这个问题啦!
内容的提问来源于stack exchange,提问作者Tirumalesh kallepalli
相关产品推荐
相关产品推荐

