Activity被回收导致fragment的getActivity为null的解决办法
Activity被回收导致fragment的getActivity为null的解决办法
bluecoffee 发表于2年前
Activity被回收导致fragment的getActivity为null的解决办法
  • 发表于 2年前
  • 阅读 15949
  • 收藏 24
  • 点赞 5
  • 评论 9

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 如果系统内存不足或者切换横竖屏或者app长时间在后台运行,Activity都可能会被系统回收,然后Fragment并不会随着Activity的回收而被回收,从而导致,Fragment丢失对应的Activity

    这两天一直被这个问题困扰,假如app长时间在后台运行,再点击进入会crash,而且fragment页面有重叠现象,让我十分不爽。研究了一天,终于明白其中的原理并加以解决。解决办法如下:

    如果系统内存不足、或者切换横竖屏、或者app长时间在后台运行,Activity都可能会被系统回收,然后Fragment并不会随着Activity的回收而被回收,从而导致,Fragment丢失对应的Activity。

    这里,假设我们继承于FragmentActivity的类为MainActivity,其中用到的Fragment为FragmentA。

    app发生的变化为:某种原因系统回收MainActivity——FragmentA被保存状态未被回收——再次点击app进入——首先加载的是未被回收的FragmentA的页面——由于MainActivity被回收,系统会重启MainActivity,FragmentA也会被再次加载——页面出现混乱,因为一层未回收的FragmentA覆盖在其上面——(假如FragmentA使用到了getActivity()方法)会报空指针,出现crash。

    原理虽然有点绕,但是解决办法很简单:

    MainActivity重写onSaveInstanceState方法,将super.onSaveInstanceState(outState);注释掉,让其不再保存Fragment的状态,达到其随着MainActivity一起被回收的效果

共有 人打赏支持
粉丝 10
博文 49
码字总数 19122
评论 (9)
bobJiao
好使吗?
bobJiao
MainActivity弹出secondActivity,然后压home按钮长时间以后,调出历史应用列表,选择此应用,之后会是个什么情况?MainActivity还存在吗;如果显示的是secondActivity,那么按返回建,MainActivity还在吗,还是要重启?
bluecoffee

引用来自“bobJiao”的评论

MainActivity弹出secondActivity,然后压home按钮长时间以后,调出历史应用列表,选择此应用,之后会是个什么情况?MainActivity还存在吗;如果显示的是secondActivity,那么按返回建,MainActivity还在吗,还是要重启?
secondActivity是个Fragment还是Activity?MainActivity入股没有被回收就会在啊
bobJiao

引用来自“bobJiao”的评论

MainActivity弹出secondActivity,然后压home按钮长时间以后,调出历史应用列表,选择此应用,之后会是个什么情况?MainActivity还存在吗;如果显示的是secondActivity,那么按返回建,MainActivity还在吗,还是要重启?

引用来自“bluecoffee”的评论

secondActivity是个Fragment还是Activity?MainActivity入股没有被回收就会在啊
哦,我用了FragmentTabHost+fragment的方式,home压后台很久之后,再启动app发现只有压home之前的那个fragment显示,tab切到其他的fragment都是一片空白,这是什么原因?
农民二狗
不还使啊
农民二狗
不好使啊
小团大人
真是救命了啊
杨兵1
听不懂啊
杨兵1
谁解释下 未回收的FragmentA在最上面 盖着???
×
bluecoffee
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: