问题描述
- 日常排查bugly上面的错误时,发现Nullpointer的问题特别严重,而相关的特征都是应用在后台和应用带fragment。排查代码发现都做了为空判断,为什么还会出现空对象的情况呢?
模拟场景
- 如果应用常驻后台,内存有可能会被系统回收,当用户重新打开应用时,app进行恢复操作,此时应用报错。
- 模拟后台内存不足可以使用android studio的自带功能,如下,将应用退到后台,点击x按钮接着重新打开app既可模拟后台被杀死情况。
问题解决
- 由上述的模拟场景发现,确实是应用退到后台杀死引起,查看代码发现fragment也进行了赋值操作。很多人在这里陷入了误区,认为fragment是同一个,其实不然,当应用在后台被杀死时,活动默认通过onSaveInstanceState(Bundle outState)进行视图的保存,当用户再次打开时,会通过onRestoreInstanceState进行视图的恢复,问题就出在这里,fragment也被保存,所以恢复的时候,我们虽然重新创建了fragment,但是活动会从保存的数据取出旧的fragment,而旧的fragment的数据又被回收了,这就是导致出现NullPointer的问题所在。
应对措施
推荐方法
- 重写fragment的onSaveInstanceSta

当Android应用在后台被系统杀死后,重新打开时可能会遇到Fragment数据丢失导致的NullPointer异常。问题在于系统在后台杀死应用时保存了Fragment状态,但恢复时旧的Fragment实例数据已被回收。解决方案包括重写Fragment的onSaveInstanceState方法来保存关键数据,或者注释掉Activity的onSaveInstanceState以避免数据保存。

2842

被折叠的 条评论
为什么被折叠?



