文档章节

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

bluecoffee
 bluecoffee
发布于 2015/06/20 18:44
字数 394
阅读 16597
收藏 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
博文 82
码字总数 30941
作品 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
Activity 与 Fragment 之间相互通信

欢迎转载,但请保留文章原始出处→→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4000390.html 联系方式:smyhvae@163.com 【正文】 一、接口回...

iSnowFlake
2015/11/19
0
1
Android 开发大坑汇总(持续更新)

android开发大坑汇总 1.EditText --> gravity与hint冲突 表现在2.X版本当在EditText设置android:gravity="center"属性后,android:hint会无效。 解决办法:再添加android:ellipsize="start"...

JamesQin
2014/08/07
0
0
Android知识点回顾之Fragment

Fragment是在API 11(Android3.0)引入的,为了能够支持适配宽屏设备,提供灵活多变的UI设计。 Fragment是嵌在Activity里面能够交互的用户界面,它的存在必须依赖于Activity,不能独立存在。...

星泉毅
2017/12/03
0
0
Android Fragment

Fragment是activity的界面中的一部分或一种行为。你可以把多个Fragment们组合到一个activity中来创建一个多面界面并且你可以在多个activity中重用一个Fragment。你可以把Fragment认为模块化的...

Thanks
2013/01/21
0
2

没有更多内容

加载失败,请刷新页面

加载更多

Spring核心概念--Spring01

小生初出程序茅庐,走上编程之路,还请各位大佬多多管照。 初学Spring框架: 创建HelloWorldSpring项目 用eclipse开发Web项目,添加jar包: commons-logging-1.2.jar log4j-1.2.17.jar spring-...

小橙子的曼曼
22分钟前
1
0
MySQL 运行状态监控方法

一、通过shell脚本监控mysql的qps,tps,io详细见附件脚本《mysqlgather.sh》 因在脚本中直接设置密码会提示告警信息,需要在my.cnf文件中的[client]标签下增加默认的用户名和密码,并重启mys...

PeakFang-BOK
26分钟前
2
0
ROS实操笔记 四 topic (主题)

主题 消息以一种发布/订阅的方式传递。一个节点可以在一个给定的主题中发布消息。一个节点针对某个主题关注与订阅特定类型的数据。可能同时有多个节点发布或者订阅同一个主题的消息。总体上,...

placido
26分钟前
1
0
【NLP】【六】gensim之doc2vec

【一】总述 doc2vec是指将句子、段落或者文章使用向量来表示,这样可以方便的计算句子、文章、段落的相似度。 【二】使用方法介绍 1. 预料准备 def read_corpus(fname, tokens_only=False):...

muqiusangyang
29分钟前
0
0
node中process.nextTick & promise & 异步IO & setTimeout & setImmediate 的优先级

process.nextTick > promise > setTimeout > 异步IO > setImmediate

小草先森
35分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部