文档章节

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

bluecoffee
 bluecoffee
发布于 2015/06/20 18:44
字数 394
阅读 16550
收藏 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
粉丝 13
博文 79
码字总数 30556
作品 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是activity的界面中的一部分或一种行为。你可以把多个Fragment们组合到一个activity中来创建一个多面界面并且你可以在多个activity中重用一个Fragment。你可以把Fragment认为模块化的...

顶层设计
2012/10/26
0
7
Android Fragment

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

Thanks
2013/01/21
0
2

没有更多内容

加载失败,请刷新页面

加载更多

记Structured Streaming 2.3.1的OOM排查过程

记Structured Streaming 2.3.1的OOM排查过程 缘起 最近在使用Structured Streaming开发一套自助配置SQL的来生成流式作业的平台,在测试的过程中发现有些作业长时间运行后会有Executor端的OOM...

纳兰清风
30分钟前
1
0
通过 websocket 连接 openfire

通过 websocket 连接 openfire 一、简介 老版本是需要安装websocket插件的。之前版本就不说了。 二、 引入XML与JSON互转的js <script src="lib/XML/ObjTree.js"></script><script src="lib......

lwenhao
34分钟前
2
0
MicropPython的学习,如何从0到1?

是Java还是C++ ? 是Go还是Python? 你为你最爱或者最熟悉的编程语言打Call了吗? Python在国外是一门非常热门的编程语言,近些年在国内也被发掘与追捧, Python的开放、简洁、黏合正符合了现发...

bodasisiter
35分钟前
1
0
Django框架17: Celery的使用

Celery介绍 1.什么是Celery Celery是一个python模块,它在官网的定义:Celery is asynchronous task queue/job based on distributed message passing. It is focused on real-time operatio......

代码打碟手
41分钟前
1
0
poi的excel解析工具类

import org.apache.commons.lang.StringUtils;import org.apache.commons.lang.time.DateFormatUtils;import org.apache.commons.lang.time.DateUtils;import org.apache.poi.hssf.use......

Sheav
45分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部