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这篇帖子的朋友。

相关文章
|
6月前
|
JavaScript IDE Java
bugly崩溃排查3:观察是谁调用了崩溃函数
bugly崩溃排查3:观察是谁调用了崩溃函数
73 0
|
存储 缓存 监控
腾讯三面:进程写文件过程中,进程崩溃了,文件数据会丢吗?
腾讯三面:进程写文件过程中,进程崩溃了,文件数据会丢吗?
191 0
腾讯三面:进程写文件过程中,进程崩溃了,文件数据会丢吗?
关于 qt程序退出出现“已停止工作”程序奔溃问题 的解决方法
关于 qt程序退出出现“已停止工作”程序奔溃问题 的解决方法
关于 qt程序退出出现“已停止工作”程序奔溃问题 的解决方法
|
监控 算法 Java
【解惑】App处于前台,Activity就不会被回收了?(下)
【解惑】App处于前台,Activity就不会被回收了?
525 0
|
缓存 监控 算法
【解惑】App处于前台,Activity就不会被回收了?(上)
【解惑】App处于前台,Activity就不会被回收了?
306 0
|
存储 数据库
activity状态保存和恢复,高手退避
activity状态保存和恢复,高手退避
186 0
|
运维 监控 JavaScript
这些后台启动姿势错过可亏大了
这些后台启动姿势错过可亏大了
172 0
这些后台启动姿势错过可亏大了
|
文字识别 网络协议 Oracle