一个Fragment中getActivity为空的问题

在Android开发中,Fragment的getActivity()经常在特定场景下返回null,如异步任务回调或App内存重启后。这源于系统回收Activity但保留了Fragment的状态。为解决此问题,可以不保存Fragment状态,重建时清除Fragment状态,或在Fragment基类中存储Activity引用。本文深入分析原因并提供三种解决方案。
摘要由CSDN通过智能技术生成

发现问题

在使用Fragment的时候经常会遇到getActivity()为null的情况,比如,在一个异步网络请求的回调中调用getActivity()就会出现空指针的问题,之前解决这个问题,都是直接加空指针判断来规避,但是这个问题并没有真正的解决。还有一种现象,如果App长时间在后台运行,再次进入App的时候,可能会出现Crash,还有Fragment会有重叠现象。这是官方Fragment库的一些自身的Bug。

假设我们的页面叫MyActivity(继承自FragmentActivity),其中用到的Fragment叫MyFragment。 出现上面这种情况时,app发生的变化如下:

1、在前面提到的几种情况下系统回收了MyActivity

2、通过onSaveInstanceState保存MyFragment的状态

3、用户再次点击进入app

4、由于MyActivity被回收,系统会重启MyActivity,根据之前保存的MyFragment的状态恢复fragment

5、MyActivity的代码逻辑中,会再次创建新的MyFragment

6、页面出现混乱,覆盖了两层的fragment。假如恢复的MyFragment使用到了getActivity()方法,会报空指针异常

查找原因

先规定一个“术语”,安卓App有一种特殊情况,就是 App运行在后台的时候,系统资源紧张的时候导致把App的资源全部回收(杀死app的进程),这时把App再从后台返回到前台时,App会重启。这种情况下文简称为:“内存重启”。(屏幕旋转等配置变化也会造成当前Activity重启,本质与“内存重启”类似)

如果系统内存不足、切换横竖屏、App长时间在后台运行,Activity都可能会被系统回收然后重建。在系统要把App回收之前,系统会把Activity的状态会保存下来,但Fragment并不会随着Activity的回收而被回收,创建的所有Fragment会被保存到Bundle里面,从而导致Fragment丢失对应的Activity。Activity的FragmentManager负责把Activity中的Fragment保存起来。在“内存重启”后,Activity的恢复是从栈顶逐步恢复,Fragment会在宿主Activity的onCreate方法调用后紧接着恢复(从onAttach生命周期开始)。

FragmentActivity的部分源码:

 protected void onSaveInstanceState(Bundle outState
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值