当前位置: 首页 > news >正文

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

相关文章:

  • SpringBoot+SpringSecurity实现基于真实数据的授权认证
  • Linux SendMail发送邮件失败诊断案例(三)
  • ElasticSearch究竟是个什么东西
  • 菜鸟学自动化测试(五)-----selenium命令之定位页面元素
  • 软件行业和互联网行业究竟有什么区别?又该如何去选择?
  • 今天打开阿里妈妈惊现 ¥50 元佣金
  • 通过官方文档高效学习ElasticSearch的JavaAPI实现!
  • 如何在自己的项目中引入ElasticSearch搜索引擎?
  • JSON--百度百科
  • 一个双非本科程序员工作一年的经历
  • guava 并发
  • Oauth2是个什么东西?
  • [javaSE] 看知乎学习工厂模式
  • 数据库分库分表扫盲,不会用也得知道概念
  • 写了那么久的String字符串,你可能根本不懂它!
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • export和import的用法总结
  • HTTP中的ETag在移动客户端的应用
  • JavaScript对象详解
  • JS字符串转数字方法总结
  • Magento 1.x 中文订单打印乱码
  • MySQL-事务管理(基础)
  • React的组件模式
  • Sass 快速入门教程
  • vue.js框架原理浅析
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 七牛云假注销小指南
  • 双管齐下,VMware的容器新战略
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • %check_box% in rails :coditions={:has_many , :through}
  • (Java)【深基9.例1】选举学生会
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (南京观海微电子)——I3C协议介绍
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET的数据绑定
  • .pop ----remove 删除
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ACM] hdu 1201 18岁生日
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [C#] 如何调用Python脚本程序
  • [EFI]Dell Inspiron 15 5567 电脑 Hackintosh 黑苹果efi引导文件
  • [HackMyVM]靶场 VivifyTech
  • [hdu 4552] 怪盗基德的挑战书
  • [HOW TO]怎么在iPhone程序中实现可多选可搜索按字母排序的联系人选择器
  • [Linux] 用LNMP网站框架搭建论坛
  • [OpenCV学习笔记]获取鼠标处图像的坐标和像素值
  • [Python]list.append字典的时候,修改字典会导致list内容变化的问题
  • [rancher] rancher部署和使用的一些思考
  • [Spring Boot 3] 整合NoSQL与构建RESTful服务
  • [Swift]LeetCode856. 括号的分数 | Score of Parentheses
  • [Unity Sentis] Unity Sentis 详细步骤工作流程