一个关于Fragment的Bug的定位与总结
来源:互联网 发布:知否的人物关系图 编辑:程序博客网 时间:2024/04/30 11:26
原文地址
这是一个之前在开发工作中遇到的Bug,排查定位了很久,觉得有必要记录一下。
故事背景:我们的Android程序M运行在定制的Android系统上,在客户交付现场演示时用的是VPN网络,当VPN断开时,问题出现了,操作系统会将我们的程序M切到后台。
问题应该从两方面去定位,首先是这个定制的Android系统,为什么在非VPN网络下使用正常,而在VPN网络下便会出现这个Bug;接着就是我们的应用程序M,接下来的分析都是在这个层面上展开的。
先从问题的现象及解决的思路开始。
BUG现象:VPN断开之后,操作系统将M切到后台,M的MainActivity
执行生命周期onPause()-onShop()-onDestroy()
退出,未调用finish()
,为非正常退出。退出后M由于程序中异常捕捉部分的代码的缘故会重新启动回到前台,此时程序直接进入MainActivity
(未经过欢迎页面),之后程序便僵死,报Fragment
重复添加到父View
的错误。
解决方法:通过打印log日志定位,判断问题产生的原因是当M被切到后台时当前处于哪个Fragment
页面下,那么该Fragment
就没有被它的父View
移除,这就导致程序重新起来后报Fragment
重复添加到父View
的错误,解决办法是在所有Fragment
的onDestroy()
方法中将它从父View
移除;
通过上述方法处理完之后暴露出了新的问题,M重新起来后没有僵死而是直接闪退,报MainActivity
视图监视器方法中出现空指针的错误。通过打印log日志,发现程序中Fragment
生命周期的执行快于MainActivity
生命周期的执行,通过分析,最后发现是由FragmentManager
引起的,FragmentManager
对象从系统中获取,它是Fragment
的管理器, Fragment
的回收与否,是由FragmentManager
来控制的,而M在VPN断开被切到后台时FragmentManager
并没有将它管理的Fragment
移除,这就导致M重回前台时在onCreate()
方法中调用父类时FragmentManager
就将它保留着的Fragment
初始化完了,那么后续重新创建的Fragment
在被添加到ViewPager
中的时候FragmentManager
并没有将它们再次初始化,导致它们的组件均为空,这就是空指针产生的原因,解决方法是在继承FragmentManager
的内部类中创建一个removeAllFragment()
的方法,在MainActivity
的onDestroy()
中调用,使M在退出时立即执行事务将Fragment
从FragmentManager
中移除;
通过上述方法的处理,M重回前台之后就没有退出了,界面显示正常,但是大部分功能无法正常使用,原因是程序中存在大量保存系统状态的static
静态变量,M在异常退出后重回前台时这些静态变量没有被重新初始化,扰乱了系统功能,这是历史遗留问题,由于修改起来工作量比较大,问题暂且搁置。
通过这次Debug,我发现自己思考问题的模式有很大的缺陷,分析问题时总是停留在猜测阶段,“我觉得……”,“这个可能是……”,经常讲出一些不确定的话,严重影响到问题的解决。这种思维方式无法引导我主动去找寻问题产生的根源,只是通过表象去揣测,去猜,当然,这是无法解决问题的。当问题产生的时候,我们应该通过分析去理清楚哪个部分是确定的,无需去再去确认,哪部分是模糊的,不确定的,带着疑问的,然后全力去分析和确认这一部分,不断缩小问题的范围,直至最终解决问题。脑子混混沌沌的人,做什么都会事倍功半,醒来吧,骚年。
- 一个关于Fragment的Bug的定位与总结
- 一次BUG定位的过程与总结
- 随笔:关于使用fragment出现的一个bug
- 关于viewpager与fragment需要刷新数据的bug,解决办法。
- 定位的一个yaffs2文件系统的bug
- HBase bulkload的一个bug定位
- 一个关于Java的装箱与拆箱的bug
- 关于Fragment的一个规范
- 关于fragment的一个实例
- 关于memagent的一个bug
- 关于缓冲区的一个BUG
- 一个关于 UIPickerView 的 bug
- 关于一个bug的解决
- 关于SwipeMenuListView的一个BUG
- 关于CAD2008的一个bug
- 关于EditText的一个Bug
- 关于解Bug的总结
- 关于解Bug的总结
- C++ 构造函数
- Kafka 开发简单示例
- 通过attr获取元素的属性值
- 转载_At a Glance on Mac OS architecture
- 软件测试的自我修养之思维方式
- 一个关于Fragment的Bug的定位与总结
- 用C语言测试Multiple-Query
- Hibernate入门
- 苹果原生GET登录
- 关于CSS 外边距合并的问题
- java模拟登录。不会存在跨域问题
- 二、slice和数组的区别,map的注意事项 -go语言笔记
- 这段时间
- ajax传递参数含有特殊字符解决方案