Android 自定义View的post(Runnable)方法非100%执行引起的问题定位

本文介绍了一种在特定条件下导致自定义ViewSwitcher中的Loading界面无法正常消失的问题,并通过研究发现该现象与应用被切换到后台后恢复时的资源调度有关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

新接手了一个项目,被告知有些页面会概率性出现一直显示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会慢于正常创建页面?这个慢慢再看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值