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

问题描述:

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

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

  1. 小米手机,程序在后台运行一段时间之后,访问不了网络

    小米手机,程序后台运行一段时间后,程序访问不了网络,访问超时,锁屏不锁屏都是一样,(不知道QQ为啥可以收到) 暂时找到的解决方案: 小米手机--设置--其他高级设置--电源和性能--神隐模式 标准(限 ...

  2. Tomcat运行一段时间后访问变慢分析历程

    主要查看三方面: 查看程序中的Session是否定时清空了 查看mysql是否有没有close的连接 查看Tomcat的内存设置,根据下列设置 环境运行一天或者几天,网站访问就很卡,手机端app访问页 ...

  3. iOS 后台运行一段时间(不是地图,音乐类型APP)

    iOS 通常是不能在后台运行的,尤其是用户点击锁屏键,APP进入后台,网络立马断开等.如何解决这个问题呢?在APP进入后台,APP怎么争取一些时间来"善后".代码如下:注:需要定义 ...

  4. kafka 运行一段时间报错Too many open files

    kafka运行一段时间报错: 出现这种错误的解决方法: 1.修改操作系统中的环境变量 修改"/etc/security/limits.conf" vim /etc/security ...

  5. tomcat服务器一直自动关,项目在tomcat里运行一段时间总是自动崩掉的问题排查与解决...

    最近的检验系统上线一段时间后,发现系统访问不了,tomcat总是会自动崩掉,一般遇到这种问题,程序员的第一反应都肯定是内存溢出. 确实是,但是java里内存分好几种,堆内存.栈内存.静态内存区等等,下 ...

  6. nohup命令解决SpringBoot/java -jar命令启动项目运行一段时间自动停止问题

    nohup命令解决SpringBoot/java -jar命令启动项目运行一段时间自动停止问题 问题背景 有一个springboot项目,放在测试服务器跑,但是隔一段时间,就会GG,要搞清楚怎么回事. ...

  7. 运行一段时间报Failed to write core dump. Core dumps have been disabled. To enable core dumping, try ulimit

    部署微服务,20个服务部署到一台腾讯云服务器上. 多个项目运行一段时间均报错: 2019-11-23 16:04:19.418 INFO 19851 --- [nio-8780-exec-4] c.c ...

  8. 服务运行一段时间,redis缓存就不可用,原来是这个锅!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:陈凯玲 来源:https://urlify.cn/RVzIR ...

  9. 运行时间_运行一段时间报高压保护

    请点击蓝字"阿理支持连"关注哦  一起来探索空调的技术 Discovery ●运行一段时间报高压保护 某地区用户报修一台柜机运行一段时间(20分钟)后报E1高压保护,到底怎么回事呢 ...

最新文章

  1. 【NLP】为什么中文分词比英文分词更难?有哪些常用算法?(附代码)
  2. 有关开发的配置的有用信息
  3. in python_数学 in python
  4. 如何订阅MQTT服务器历史消息,MQTT协议之消息订阅
  5. 典范杜希奇与机器人_典范英语7_16 杜希奇与机器人.ppt
  6. C++串行编程步骤介绍
  7. 关于UploadValues ,太可恶了
  8. iOS分段选择器、旅行App、标度尺、对对碰小游戏、自定义相册等源码
  9. WPF 视频教程+笔记
  10. 【AWVS12】安全漏洞扫描工具,使用详解
  11. Multisim14仿真使用汇总
  12. 【性能优化实战】日语java开发相关词汇
  13. 多种平面设计排版版型,轻松为你解决排版难题
  14. Axure设置变量 做乘法计算
  15. matlab在常微分方程的应用,MATLAB在求解常微分方程中的应用
  16. 1. 从键盘输入一系列字符(以回车符结束,字符的个数不超过 200 个),统计输入字符串中数字与非数字字符的个数,并将计数结果输出。
  17. html鼠标悬停提示文字
  18. 2020年G1工业锅炉司炉考试总结及G1工业锅炉司炉试题及答案
  19. C语言练习——逆序输出数字
  20. DirectX的error LNK2019: 无法解析的外部符号 _Direct3DCreate9@4,该符号在函数 long __cdecl InitD3D(struct HWND__ *)

热门文章

  1. 4号团队-团队任务5:项目总结会
  2. Dockerfile详解(二)
  3. 数学中各种矩阵收集(转至其他博主)
  4. Docker入门(CentOS7)
  5. Nginx的nginx.conf配置文件中文注释说明
  6. 【python cookbook】【字符串与文本】5.查找和替换文本
  7. c#中将HTML文件转换成PDF文件
  8. 微信小程序实现点击不同view标签,移动到一行
  9. 驱动人生2008_驱动人生致敬深圳经济特区建立四十周年!
  10. whea uncorrectable error蓝屏_Windows 10再出“不可选”更新:蓝屏、死机比较烦