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

问题描述:

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方法:

 protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
Parcelable p = mFragments.saveAllState();
if (p != null) {
outState.putParcelable("android:support:fragments", p);
}
}

  由上面源码可以看出,FragmentActivity确实在onSaveInstanceState方法里面将Fragment的状态保存了。

问题解决:

  知道问题的原因了,就好办了。解决方法其实很简单,我们只要让FragmentActivity被系统回收的时候,不保存Fragment的状态即可,即在FragmentActivity中重写onSaveInstanceState方法,并且注释掉super.onSaveInstanceState(outState)就行了。

     @Override
protected void onSaveInstanceState(Bundle outState) {
// super.onSaveInstanceState(outState);
}

总结:

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

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

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

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

  1. 【生产环境】Tomcat运行一段时间后访问变慢分析历程

    环境运行一天或者几天,网站访问就很卡,手机端app访问页面出现白屏.Tomcat运行一段时间后访问变慢,但是cpu,内存都正常.日志也是发现不了啥.... 问题的原先分析 1.环境配置(cpu,内存, ...

  2. WCF服务运行一段时间后客户端无法连接WCF服务的解决办法 (转)

    WCF服务运行一段时间后客户端无法连接WCF服务的解决办法 (转) Windows Communication Foundation (WCF)是Microsoft为构建面向服务的应用提供的分布式通信 ...

  3. k8s的flannel的pod运行一段时间init error

    问题现象 使用Kubeadm部署的flannel网络运行一段时间后,提示init:Error错误,查看具体的信息如下: [root@node1 ~]# kubectl describe pod kub ...

  4. Pycharm 在Windows下出现闪退问题(即是在运行一段时间后,自己就退出崩掉了)的解决方法

    Pycharm 在Windows下出现闪退问题(即是在运行一段时间后,自己就退出崩掉了)的解决方法 最近自己下载了最新版本的Pycharm,运行程序过程中发现,在运行一段时间后(比如10几分钟),Py ...

  5. java程序运行一段时间之后停止

    原创文章,未经作者允许,禁止转载!!!!!!! 如何用java是一段代码运行一段时间之后自动停止运行? 就拿打印随机函数的代码来做例子吧,让程序随机打印1-10的数字,打印十秒钟后停止打印: publ ...

  6. tomcat运行一段时间后报错"Too many open files"

    tomcat运行一段时间后报打开太多文件错误:Too many open files  查看当前进程的文件打开数: lsof -n |awk '{print $2}'|sort|uniq -c |so ...

  7. mysql5.6运行一段时间之后网站页面出现乱码解决办法

    mysql5.6运行一段时间之后网站页面出现乱码,怎么都打不开,经过排查之后,知道是数据库默认字符集出问题了,在此分享给大家经验. 在mysql5.6配置文件:my.ini 找到: 添加如下内容: [ ...

  8. 【原创】大叔经验分享(54)flume kudu sink运行一段时间kudu client报错

    flume kudu sink运行一段时间报错: 19/05/05 10:15:56 WARN client.ConnectToCluster: Error receiving a response ...

  9. 网站运行一段时间后就无法访问,重启Tomcat才能恢复

    网站运行一段时间后就无法访问,重启Tomcat才能恢复出现这种情况,很可能是以下几种情况:1.超过数据库连接池上限2.并发数达到上限3.内存溢出具体还是需要通过打印的日志进行具体分析.解决方法1.如果 ...

随机推荐

  1. [Delphi编译错误]F2084 Internal Error: U2107

    看到这个错误真是头痛,这是一个很旧的项目了,想修改下东西,清理下工程一编译出现这个该死的错误,百度了下,也没解决问题.没办法只好编译所有的BPL了.   这个项目是带包编译的,而且带了几个自己的包. ...

  2. SEO站长必备的十大常用搜索引擎高级指令

    作为一个seo人员,不懂得必要的搜索引擎高级指令,不是一个合格的seo.网站优化技术配合一些搜索引擎高级指令将使得优化工作变得简单.今日就和大家聊聊SEO站长必备的十大常用搜索引擎高级指令的那些事儿. ...

  3. [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist

    mysql 启动总是报错: 错误日志中显示: [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' ...

  4. try catch finally return之间的关系

    一.try catch finally return之间的关系: 正在写dsoFramer的时候,同事突然说面试的时候问的一个问题,catch和return那个先执行,我瞬间迷茫了,然后整理了整理,稍 ...

  5. 阿牛OCX编程助手

    ※◆☆★☆◆※欢迎使用阿牛OCX编程助手,此程序为按键精灵专用,如终请联系作者QQ:82850696*0*测试版已停用*0*2014-12-27 14:05:59*哈密*E2873D0137C6D04 ...

  6. 数据库的char(n)

    Mysql中的char(n)或者varchar(n) 其中的n就是代表列,不代表字节! varchar(n)其中的n最多是65535 , 应该在创建表的同时,指定表的编码方式为latin1,因为lat ...

  7. hdu 1003

    Max Sum Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Statu ...

  8. nodejs: C++扩展

    Nodejs的C++扩展首先保证nodejs和v8都正确安装 下载NodeJS源码,我的放在D盘. NodeJS的C++扩展要用VS2010开发,新建一个空的Win32控制台项目,右键——属性,在常规 ...

  9. Python3学习(3)-高级篇

    Python3学习(1)-基础篇 Python3学习(2)-中级篇 Python3学习(3)-高级篇 文件读写 源文件test.txt line1 line2 line3 读取文件内容 f = ope ...

  10. Windows 8.1 应用再出发 - 几种更新的控件

    Windows 8.1 除了新增了很多很有用的控件外,还对一些控件做出了更新.接下来我们一起对这些更新的控件一一做出讲解. 1. FlipView 更新 翻转视图控件,在应用中常用作图片等内容的翻页/ ...