Activity后台运行一段时间回来crash问题的分析与解决
来源:互联网 发布:软件开发项目成果 编辑:程序博客网 时间:2024/05/17 00:16
最近做项目的时候碰到一个棘手的问题,花了不少时间才找到原因并解决。特此记录这个被我踩过的坑,希望其他朋友遇到此问题不要调到这坑里去了。
问题描述:
1、背景:我的app中某个界面的Activity是继承FragmentActivity,因为此界面包含两个Fragment。这里我称为FragmentA和FragmentB吧。在Activity中有个刷新按钮,用来刷新ViewPager当前Fragment内容的刷新。点击Activity的刷新按钮之后,刷新按钮需要有简单的旋转动画,等Fragment里面的刷新结束之后,会使用getActivity通知Activity结束刷新按钮的刷新动画。以上就是我的业务场景,说简单点就是Fragment需要与它附属的Activity进行通信。
2、问题:当应用程序运行到该Activity时,按Home键将该应用程序放置后台运行,去其他app转转。一段时间后,又回到该应用程序,还是在之前的那个Activity。这时我想刷新一下Fragment里面的内容,点击了Activity界面上的刷新按钮,结果程序crash了。
问题分析:
刚开始遇到该问题时,查看奔溃日志,发现是空指针异常。因为这种场景不多,所以只是简单的加上非空判断就没在意这个问题了。到后面换了个测试机器,配置不是很好(只有512M运行内存),结果此问题频繁地出现,开始引起我的重视了。由于经验不是很足,此问题不知道怎么重现,所以很难找出问题的根本原因。后来终于在网上找到了一篇和我遇到同样问题的朋友的帖子,才知道出现这个问题的原因所在。
原来Activity切换到后台之后,由于内存不够,此Activity被系统回收了,一段时间之后回到该应用程序,Activity被重新实例化了。而Activity被系统销毁时,附属在该Activity的Fragment并没有被销毁,在Activity的onSaveInstanceState里面将Fragment状态保存起来了,所以Activity重新创建了,但是FragmentA和FragmentB还是之前的,而此时FragmentA和FragmentB所附属的Activity已经被系统回收了,这次再调用getActivity时返回了null,才导致上面问题的出现。
我们看看FragmentActivity源码中的onSaveInstanceState方法:
1 protected void onSaveInstanceState(Bundle outState)2 {3 super.onSaveInstanceState(outState);4 Parcelable p = mFragments.saveAllState();5 if (p != null) {6 outState.putParcelable("android:support:fragments", p);7 }8 }
由上面源码可以看出,FragmentActivity确实在onSaveInstanceState方法里面将Fragment的状态保存了。
问题解决:
知道问题的原因了,就好办了。解决方法其实很简单,我们只要让FragmentActivity被系统回收的时候,不保存Fragment的状态即可,即在FragmentActivity中重写onSaveInstanceState方法,并且注释掉super.onSaveInstanceState(outState)就行了。
1 @Override2 protected void onSaveInstanceState(Bundle outState) {3 // super.onSaveInstanceState(outState);4 }
总结:
1、程序出现问题时,要先找出出现此问题的原因,对症下药才能从根本上解决问题。
2、对于Activity被系统回收导致的问题,可以使用切换横竖屏来模拟场景
原文地址http://www.cnblogs.com/liuling/p/2015-9-21-1.html
- Activity后台运行一段时间回来crash问题的分析与解决
- Activity后台运行一段时间回来crash问题
- Monkey测试实际Native Crash问题的分析与解决思路
- Monkey测试实际Native Crash问题的分析与解决思路
- ListView和Adapter Crash问题的分析和解决
- 解决虚拟机中运行Hive和Hadoop一段时间后磁盘空间不足的问题
- 解决oracle连接一段时间就断连的问题
- Android Crash 问题分析以及解决
- linux kernel crash问题分析解决
- 应用切换到后台一段时间再切回来会崩溃
- 从后台切换回来或者从Tabbarcontroller切换回来动画还能继续运行的解决方案
- Android Studio无法利用模板新建Activity与Fragmnet的问题分析与解决
- 关于winform ListBox的跨线程用法,利用委托解决控件运行一段时间clear报null的问题
- 解决Activity onCreate()时AnimationDrawable动画不运行的问题
- Wince 运行一段时间后同步出错的问题
- Android 实现后台运行Activity的方法
- 解决因UINavigationControllerDelegate造成的crash问题
- iOS开发如何通过UMeng的错误分析解决crash问题
- Python,Jupyter Notebook,IPython快速安装教程
- CodeForces 441A Valera and Antique Items
- 一个字符串排序的程序
- 《HeadFirst JavaScript》学习笔记
- Linux内核构建系统之二
- Activity后台运行一段时间回来crash问题的分析与解决
- C++ 输入输出流和文件流 (2010-01-17 13:34:03)http://blog.sina.com.cn/s/blog_700a65cc0100mi5o.html
- 数据结构与算法——给定整数A1,A2,....An,....(可能有负数),求该数据序列的最大子序列的和
- Unity不规则碰撞
- 插件升级“无法定位 WordPress 内容目录”
- struts + mybatis +spring实现黑名单/灰名单管理
- 单台机器上设置多个域名,二级域名绑定到子目录
- Swift之多线程
- MYSQL学习