今天测试提了一个非常奇怪的问题,我花了好长时间才解决,记录一下我的心酸找bug历程。。。
问题描述:
目前有三个activity A、B、C,A为singleTask模式,B和C为标准模式,A启动B,B启动C,C再启动A。懂启动模式的都知道,singleTask模式有clearTop效果,所以现在应该直接显示A,B和C都出栈了。
可是再测试的一个5.0小手机上却出现了怪像,当从C打开A的时候,并没有直接回到A,而是先回到B,过了好几秒才自动回到A。这不符合逻辑啊!而且在别的测试机上没问题啊。
下面开始找问题所在
首先我想到是,可能是这手机系统有问题,那我就新建一个项目,再建三个上述的activity,在有问题的手机上测试,结果没毛病啊!
然后我看看是不是生命周期出什么问题了,那就将BC生命周期打印出来,发现在正常手机上,从C启动A的生命周期如下:
B: onStop
B: onDestory
C: onPause
C: onStop
C: onDestory
也就是说,是B先结束,然后才结束C的,从这也了解到singleTask模式的生命周期
那我们在看看出现Bug 的手机上的生命周期
C: onPause
C: onStop
C: onDestory
B: onStop
B: onDestory
和正常的正好相反了,而且在C onDestory后大概三秒钟,B才destory。。。
然后我想会不会是因为在生命周期里做了耗时操作,可检查了代码也没有啊。
那会不会是项目框架有问题呢,那就再项目中新建三个activity,D(singleTask)、E、F,做上述类似的跳转测试,发现是正常的,那肯定就是A、B、C代码有问题了。
那现在就得先定位到底是哪个类有问题了,我采用以下方法做测试
首先,测试 A -> E -> F ->A 跳转,发现是有问题的
再测试 D -> B -> C ->D跳转,发现是没问题的
那就是A activity有问题了! 找到存在问题的类,就好办多了,开始查看A中的代码呗。
A中代码也比较多,一点点开始审查,找了半天,最后我发现问题存在一个自定义View中,这个view在做一个无限循环的animation,但是却没有在onpause或ondetory中关掉动画,这会导致内存泄漏(也很奇怪为什么测试人员的工具没测出来)。然后我就在A的onPause中关掉这个动画,onresume再启动,测试,发现一切正常!
(这个问题代码是同事写的。。。)
总结:
为什么这个内存泄露会导致跳转异常还有待研究,但是我们一定要养成好的代码习惯啊!大家要是遇到类似这种问题,就先检查检查哪儿存在内存泄露的问题吧。