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

相关文章
|
存储 机器学习/深度学习 缓存
一看就懂!图解 Kotlin SharedFlow 缓存系统
一看就懂!图解 Kotlin SharedFlow 缓存系统
566 2
|
机器学习/深度学习 自然语言处理 算法
文本分析-使用jieba库进行中文分词和去除停用词(附案例实战)
文本分析-使用jieba库进行中文分词和去除停用词(附案例实战)
11413 145
|
开发工具 Android开发 git
解决Android AAPT: error: resource android:attr/lStar not found. 问题
解决Android AAPT: error: resource android:attr/lStar not found. 问题
1650 0
|
1月前
|
测试技术 定位技术 开发工具
海外 APP 开发与上线
APP出海远不止翻译界面!需攻克四大关键战役:①云架构迁移+真本地化(UI/UX、登录方式、时区货币);②严守GDPR/CCPA等隐私合规,通过苹果Privacy Manifest与谷歌Data Safety审核;③接入IAP(苹果/谷歌)、Stripe/PayPal或AdMob等海外支付与广告体系;④完成ASO本地化、灰度上线及商店资质准备。代码须彻底“去国内SDK化”。
|
人工智能 自然语言处理 API
MCP与A2A协议比较:人工智能系统互联与协作的技术基础架构
本文深入解析了人工智能领域的两项关键基础设施协议:模型上下文协议(MCP)与代理对代理协议(A2A)。MCP由Anthropic开发,专注于标准化AI模型与外部工具和数据源的连接,降低系统集成复杂度;A2A由Google发布,旨在实现不同AI代理间的跨平台协作。两者虽有相似之处,但在设计目标与应用场景上互为补充。文章通过具体示例分析了两种协议的技术差异及适用场景,并探讨了其在企业工作流自动化、医疗信息系统和软件工程中的应用。最后,文章强调了整合MCP与A2A构建协同AI系统架构的重要性,为未来AI技术生态系统的演进提供了方向。
1968 62
|
Java Android开发 C++
Android源代码定制:MK文件执行顺序|属性覆盖
Android源代码定制:MK文件执行顺序|属性覆盖
2005 2
Android源代码定制:MK文件执行顺序|属性覆盖
|
Android开发
Android Activity跳转详解
Android Activity跳转详解
1606 0
|
网络协议 文件存储 Docker
DIY nas 之追番下载工具AutoBangumi
AutoBangumi是一款基于Mikan Project和qBittorrent的全自动追番整理下载工具。
1319 1
|
Java Android开发
Android开发--Intent-filter属性详解
Android开发--Intent-filter属性详解
510 0
|
Android开发
Android studio 出现Plugin [id: ‘com.android.application‘, version: ‘8.1.0‘, apply: false] 问题解决办法
Android studio 出现Plugin [id: ‘com.android.application‘, version: ‘8.1.0‘, apply: false] 问题解决办法
7264 2