Activity被回收导致fragment的getActivity为null的解决办法
2016-06-15 10:40
309 查看
这两天一直被这个问题困扰,假如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一起被回收的效果!
如果系统内存不足、或者切换横竖屏、或者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一起被回收的效果!
相关文章推荐
- swift 值引用
- .NET Core创建一个控制台(Console)程序
- 用C#制作PDF文件全攻略
- opencv与ffmpeg数据结构
- 安卓代码学习录
- APK动态加载框架(DL)解析
- apache + resin的多机部署方案实现方法WEB服务器
- MyBatis SQL注入
- C++ Builder 中对编辑框输入double类型数据或只输入字母或数字进行限定
- 最大子段和
- Zend Studio 12.5.1 破解、注册码
- NO.162 禅道荣膺软件测试行业最常用测试管理工具第一名!
- 豆沙绿颜色
- 【iOS】使用 CocoaPods 导入文件没有提示
- JS--实现简单轮播(一)
- MFC图形用户界面——简单一元二次方程求根
- 权限修饰符
- Scrapy:python3下的第一次运行测试
- Javascript模块模式
- CentOS7 中文man(cman)配置方法