Android开发无法从SharedPreferences获取数据及存取代码参考
常见原因
- 写入值本身为空:
binding.realOtp输入框无内容时,trim后得到空字符串,存入后读取到空值会被误认为读取失败 - 执行时序错误:读取代码的执行时机早于写入代码,比如还没触发写入的点击事件,就先在页面初始化阶段执行了读取逻辑
- 跨进程访问:SharedPreferences本身不支持跨进程读写,若在多进程场景下访问同一份SP文件,即使用废弃的
MODE_MULTI_PROCESS参数也无法保证数据一致性,会出现读取失败 - 命名不匹配:读写时使用的SP文件名、存储key的拼写或大小写不一致,导致无法匹配到对应存储条目
- 数据已被清除:应用清除缓存/数据、卸载重装后,沙盒内的SP文件会被删除,之前存储的数据全部失效
解决方案
- 写入前增加非空校验和日志,确认写入逻辑正常执行:
phone = binding.realOtp.getText().toString().trim(); if (!TextUtils.isEmpty(phone)) { SharedPreferences sharedPreferences = getSharedPreferences("MySharedPref", MODE_PRIVATE); SharedPreferences.Editor myEdit = sharedPreferences.edit(); myEdit.putString("phone", phone); // 对写入可靠性要求高、需要立刻读取的场景可替换为commit(),注意commit为同步操作,不要在主线程执行频繁写入 myEdit.apply(); Log.d("SP_CHECK", "写入phone值:" + phone); } else { Log.e("SP_CHECK", "待写入的phone值为空,未执行存储"); }
- 读取时设置可识别的兜底值,方便问题定位:
SharedPreferences sharedPreferences = getSharedPreferences("MySharedPref",MODE_PRIVATE); // 兜底值设置为特殊标记,区分是存储为空还是读取失败 String y = sharedPreferences.getString("phone", "SP_READ_FAILED"); Log.d("SP_CHECK", "读取到的phone值:" + y);
- 多进程场景下不要使用SharedPreferences存储共享数据,替换为MMKV、ContentProvider等支持跨进程的存储方案
- 核对读写逻辑中的SP文件名、存储key完全一致,不要出现拼写、大小写、多余空格的问题
注意:同进程下apply()的内存缓存会立即更新,写完立刻读不会出现数据未同步的问题,只有跨进程场景才会出现数据不更新的情况
内容的提问来源于stack exchange,提问作者Arya Prakash
相关产品推荐
相关产品推荐

