修改应用运行时存储权限后无法读取内存数据报NullPointerException求助
问题根因
- 安卓系统原生逻辑:应用运行过程中,你跳转到系统设置修改存储这类敏感权限时,系统会直接销毁当前应用的后台进程。等你切回应用时,系统只会自动恢复最近的Activity栈,并不会恢复进程被杀前的内存数据。
- 你当前将
LanguageInitBean存储在LanguageInitCache类的静态变量中,静态变量的生命周期完全和应用进程绑定,进程被杀后内存会被全部回收,新启动的进程里这个静态变量默认就是null。 - 进程重建后你没有重新执行初始化逻辑给这个静态变量赋值,直接访问它的
data字段,就会抛出对应的空指针异常。
修复方案
- 所有访问
LanguageInitCache.languageInitBean的位置必须先做空判断,为空时触发重初始化逻辑:要么跳转回启动页重新拉取接口解析赋值,要么读取本地持久化存储的配置恢复静态变量,参考示例:
// 访问前先判空 if (LanguageInitCache.languageInitBean != null) { LanguageInitBean.Data data = LanguageInitCache.languageInitBean.data; // 执行业务逻辑 } else { // 走重新初始化逻辑 reInitLanguageConfig(); }
- 核心配置类数据不要仅靠静态变量做内存存储,将
LanguageInitBean序列化后存入MMKV、SharedPreferences或者本地文件做持久化,每次应用冷启动、进程重建时优先从本地读取数据恢复静态缓存,不需要每次都重新请求接口。 - 可以在基类Activity的
onCreate方法中增加进程重建校验逻辑:如果核心静态缓存为空,说明当前是进程被杀后的重建场景,直接拦截当前页面跳转,先走完整的应用初始化流程,避免后续业务逻辑连续报错。
内容的提问来源于stack exchange,提问作者ningzhaobin
相关产品推荐
相关产品推荐

