Activity后台运行一段时间回来crash问题的分析与解决

最近做项目的时候碰到一个棘手的问题,花了不少时间才找到原因并解决。特此记录这个被我踩过的坑,希望其他朋友遇到此问题不要调到这坑里去了。

问题描述:

     
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     @Override
2     protected void onSaveInstanceState(Bundle outState) {
3 //        super.onSaveInstanceState(outState);
4     }

总结:

  1、程序出现问题时,要先找出出现此问题的原因,对症下药才能从根本上解决问题。

  2、对于Activity被系统回收导致的问题,可以使用切换横竖屏来模拟场景。

 

最后感谢写http://my.oschina.net/u/1011854/blog/469138这篇帖子的朋友。

时间: 2024-11-18 05:37:40

Activity后台运行一段时间回来crash问题的分析与解决的相关文章

android 后台运行-android 项目后台运行一段时间会自己退出并报错

问题描述 android 项目后台运行一段时间会自己退出并报错 最近的一个项目 当我运行项目在后台运行然后过段时间 他会自己报错并退出,在模拟器上不报错,请高手指点是什么原因. 解决方案 用模拟器重新运行试试

效果-java线程问题(是否可将部分代码设置在后台运行一段时间)

问题描述 java线程问题(是否可将部分代码设置在后台运行一段时间) 我想要的效果是我在下载文件时显示下载进度条, 并在下载完成后弹出提示框询问是否安装! 实际上是一开始下载时询问的提示框就和进度条一起出现了, 并且进度条显示到30%多的时候会突然降为0, 然后一段时间后再增加,所以进度条总是无法显示到100% 解决方案 你把界面和下载线程分开就好了,然后通过线程向外面传参数 解决方案二: 这是我积累的一些java项目源码 你可以参考参考 不过有点基础http://download.csdn.n

网站运行一段时间ASP页面都打不开解决办法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 网站运行一段时间asp页面都打不开.相信很多人都遇到了这问题.特别郁闷. 这个问题的解决办法如下: asp站点状况:运行一段时间(不知道多长,1天或者几天或者几个小时)IIS假死,ASP无法访问,站上的html都正常可访问. 状况:运行一段时间(不知道多长,1天或者几天或者几个小时),然后asp页面就无法访问,但是静态页面可以访问,ftp可以

新开发的系统后台是Websphere portal server V6,运行一段时间后wps后台报内存溢出。请各位高手分析一下原因,帮忙解决一下。谢了!!!

问题描述 新开发的系统后台是WebsphereportalserverV6,运行一段时间后wps后台报内存溢出.请各位高手分析一下原因,帮忙解决一下.谢了!!! 解决方案 解决方案二:内存启动时开多大的?应用程序也存在引起OOM的问题,一步步分析定位来解决吧后台的log发出来解决方案三:先用内存分析工具确定是不是自己的应用有问题,排除了这个问题,再从portal入手找问题,看是不是portal自带数据库的问题......解决方案四:从网上找一个内存分析工具看一下那个对象出现了泄漏,这个不通过工具

内存溢出-tomcat7运行一段时间总是死掉

问题描述 tomcat7运行一段时间总是死掉 这是打印的错误日志: # A fatal error has been detected by the Java Runtime Environment: # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006d9d6262, pid=4864, tid=3628 # JRE version: 6.0_27-b07 Java VM: Java HotSpot(TM) 64-Bit Ser

程序运行一段时间,tomcat无反应,页面显示白页,不跳转

问题描述 程序运行一段时间,tomcat无反应,页面显示白页,不跳转 程序部署一段时间后,正常运行很久,但是最近出现了一种情况.当点击某个action类进行跳转的时候 页面无响应,tomcat后台也没有log输出,只有重新启动才能解决问题. 想问问这种情况是如何产生的,有什么好的解决方法,谢谢

websphere应用服务器性能调整建议,针对运行一段时间后当机

最近项目的websphere经常当机,运行一段时间后变慢然后当掉.查找了下网上的资料,尽管不是我在负责服务器,但是也是个学习的机会. 主要针对的症状:           平台:was5.1   base,http   server   1.3.28,oracle   8i,9i           症状:用户响应突然变慢,然后并连接不上80端口,重启后正常,一段时间后反复           解决方式:调整服务器参数,增加服务器的处理能力               1,更改http   se

tomcat运行一段时间后页面报HTTP Status 500

问题描述 web网页在运行一段时间后就出现HTTPStatus500错误,重新启动Tomcat后又正常.出现信息:typeExceptionreportmessagedescriptionTheserverencounteredaninternalerror()thatpreventeditfromfulfillingthisrequest.exceptionorg.apache.jasper.JasperExceptionorg.apache.jasper.servlet.JspServlet

arm-Liunx驱动死机,经常运行一段时间,报错重启问题

问题描述 Liunx驱动死机,经常运行一段时间,报错重启问题 驱动程序运行一段时间之后,就容易报这种错误重启. [ 122.377666] Unable to handle kernel paging request at virtual address 4d118106 [ 122.384417] pgd = d497c000 [ 122.387603] [4d118106] *pgd=00000000 [ 122.391150] Internal error: Oops: 5 [#1] PR