fragment 在后台被杀死 数据丢失

来源:互联网 发布:手机淘宝上的免费开店 编辑:程序博客网 时间:2024/06/05 11:30

问题描述

  • 日常排查bugly上面的错误时,发现Nullpointer的问题特别严重,而相关的特征都是应用在后台应用带fragment。排查代码发现都做了为空判断,为什么还会出现空对象的情况呢?

模拟场景

  • 如果应用常驻后台,内存有可能会被系统回收,当用户重新打开应用时,app进行恢复操作,此时应用报错。
  • 模拟后台内存不足可以使用android studio的自带功能,如下,将应用退到后台,点击x按钮接着重新打开app既可模拟后台被杀死情况。
    这里写图片描述

问题解决

  • 由上述的模拟场景发现,确实是应用退到后台杀死引起,查看代码发现fragment也进行了赋值操作。很多人在这里陷入了误区,认为fragment是同一个,其实不然,当应用在后台被杀死时,活动默认通过onSaveInstanceState(Bundle outState)进行视图的保存,当用户再次打开时,会通过onRestoreInstanceState进行视图的恢复,问题就出在这里,fragment也被保存,所以恢复的时候,我们虽然重新创建了fragment,但是活动会从保存的数据取出旧的fragment,而旧的fragment的数据又被回收了,这就是导致出现NullPointer的问题所在。

应对措施

  • 推荐方法

    • 重写fragment的onSaveInstanceState方法,将需要保存的数据进行保存,在fragment重新创建的时候,取出相应的保存数据既可。

    • 粗暴方法

    • 重写activity的onSaveInstanceSate()方法,将super.onSaveInstanceState注释,这样子activity在被杀死时,就无法进行数据的保存了。

参考链接

我踩到的关于Fragment 状态的保存和恢复的坑

原创粉丝点击