文档章节

Activity被回收导致fragment的getActivity为null的解决办法

bluecoffee
 bluecoffee
发布于 2015/06/20 18:44
字数 394
阅读 16637
收藏 24

    这两天一直被这个问题困扰,假如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一起被回收的效果

© 著作权归作者所有

共有 人打赏支持
bluecoffee
粉丝 14
博文 84
码字总数 31261
作品 0
秦皇岛
程序员
私信 提问
加载中

评论(9)

杨兵1
谁解释下 未回收的FragmentA在最上面 盖着???
杨兵1
听不懂啊
小团大人
小团大人
真是救命了啊
农民二狗
农民二狗
不好使啊
农民二狗
农民二狗
不还使啊
bobJiao
bobJiao

引用来自“bobJiao”的评论

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

引用来自“bluecoffee”的评论

secondActivity是个Fragment还是Activity?MainActivity入股没有被回收就会在啊
哦,我用了FragmentTabHost+fragment的方式,home压后台很久之后,再启动app发现只有压home之前的那个fragment显示,tab切到其他的fragment都是一片空白,这是什么原因?
bluecoffee
bluecoffee

引用来自“bobJiao”的评论

MainActivity弹出secondActivity,然后压home按钮长时间以后,调出历史应用列表,选择此应用,之后会是个什么情况?MainActivity还存在吗;如果显示的是secondActivity,那么按返回建,MainActivity还在吗,还是要重启?
secondActivity是个Fragment还是Activity?MainActivity入股没有被回收就会在啊
bobJiao
bobJiao
MainActivity弹出secondActivity,然后压home按钮长时间以后,调出历史应用列表,选择此应用,之后会是个什么情况?MainActivity还存在吗;如果显示的是secondActivity,那么按返回建,MainActivity还在吗,还是要重启?
bobJiao
bobJiao
好使吗?
使用Fragment应用放置后台很久再次进入出现闪退的解决方法

解决办法:在FragmentActivity里oncreate方法判断savedInstanceState==null才生成新Fragment;否则不做处理 @Overrideprotected void onCreate(Bundle savedInstanceState) { if (savedInsta......

莱茵河水怪v241Beta
2015/08/18
0
0
Android类参考---Fragment(一)

1. 继承关系 java.lang.Object |__android.app.Fragment 实现接口:ComponentCallbacks2 View.OnCreateContextMenuListener 引入版本:API Level 11 已知的子类: DialogFragment、ListFragm......

长平狐
2012/10/16
408
0
Android Fragments 详细使用详细介绍

其它推荐: [原创]android版本飞鸽传书源码(附图) Android植物大战僵尸对战版源码 实用源码——Android屏幕锁源码 Fragments 诞生初衷 自从Android 3.0中引入fragments 的概念,根据词海的翻译...

长平狐
2012/08/21
624
1
Android Fragments 详细使用详细介绍

其它推荐: [原创]android版本飞鸽传书源码(附图) Android植物大战僵尸对战版源码 实用源码——Android屏幕锁源码 Fragments 诞生初衷 自从Android 3.0中引入fragments 的概念,根据词海的翻译...

长平狐
2012/08/14
238
0
Android Fragments 详细使用详细介绍

其它推荐: [原创]android版本飞鸽传书源码(附图) Android植物大战僵尸对战版源码 实用源码——Android屏幕锁源码 Fragments 诞生初衷 自从Android 3.0中引入fragments 的概念,根据词海的翻译...

长平狐
2012/08/09
243
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud Greenwich 新特性和F升级分享

2019.01.23 期待已久的Spring Cloud Greenwich 发布了release版本,作为我们团队也第一时间把RC版本替换为release,以下为总结,希望对你使用Spring Cloud Greenwich 有所帮助 Greenwich 只支...

冷冷gg
59分钟前
46
1
精读《论语》读后感作文3600字

精读《论语》读后感作文3600字: 学而篇第一:子曰:“学而时习之,不亦说乎?有朋友自远方来,不亦悦乎?人不知,而不愠,不亦君子乎? 朱熹解:即学而又时时习之,则学者熟,而衷心喜悦,其...

原创小博客
今天
0
0
CPU内存结构

开局一张图 由于CPU频率太快了,为解决直接读取内存的数据上的延迟,在CPU和内存之间,存在3级缓存。 CPU在解决和缓存不一致上采用两种方式: 缓存一致性协议 总线锁机制 CPU CPU的一个时钟周...

春哥大魔王的博客
今天
2
0
记一次centos 7内核升级事故

情景 公司做等保3测评,在进行系统漏洞检测时发现内核存在漏洞,需要进行升级。 名称 版本 升级前内核 CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core) 升级后内核 CentOS Linux (3.10.0-957...

阿dai
今天
9
0
PowerDesigner操作

1.去掉生成DDL里的注释 Database -> Edit Current DBMS -> Script -> Syntax -> BlockComment,去掉BlockComment里面的value内容。...

了凡川
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部