背景
新接手了一个项目,被告知有些页面会概率性出现一直显示Loading界面,不加载内容,也不显示超时、无数据、网络异常等等,而且没有复现步骤。
问题定位
猜测是Loading界面在某种情况下未Gone掉。带着猜测看代码结构,首先去找对应的Loading界面,发现:
1.项目里界面显示使用的是自定义的ViewSwitcher,定义了两层,这里暂时用A、B层表示,A层是包含Loading、超时、无数据、网络无连接等各种状态,B层就是页面的展示。
2.当发起网络请求时A层将Loading设为Visible,其它设为Gone。
3.当出现异常,Visible对应的View,Gone掉Loading。
4.如果网络请求正常返回则在自定义的ViewSwitcher中使用post(Runnable)调用showNext()将B层展示出来
看到这里,和最初的猜测已经有点出入了,Loading唯一Gone掉是在网络异常情况且伴随着其它状态View的Visible,那么有没有可能是post(Runnable)并没有执行或者是showNext()方法存在什么bug,针对这两个想法上网查了下,发现View的post(Runnable)确实会在某种情况不被执行,参考文章:http://blog.youkuaiyun.com/xavier__s/article/details/50260981 ,问题应该是找到了,但是还没有复现步骤,后来巧合下发现当应用被切换到后台并被回收了的时候,再次打开恢复就会复现这个问题,那么新问题来了,为什么恢复页面View attachWindow会慢于正常创建页面?这个慢慢再看。