Android进度条4秒从0到100耗时超预期问题求助
进度条无法精准在4秒内完成,且日志越多耗时越长
我需要进度条在精准4秒内完成0到100的进度展示,但实际运行耗时总是超过预期,而且日志记录次数越多,耗时越长。以下是我的代码及日志信息:
private fun progress1 (int: Int=1){ if (int in 1..100){ if (int==1){ startTime=System.currentTimeMillis() coroTine.launch { aa.progressbar1.setProgress(int, true) delay(40) progress1(int + 1) } } if (int in 2..100){ if (int in 2..99){ coroTine.launch { aa.progressbar1.setProgress(int,true) delay(40) progress1 (int+1) } } } if (int==100){ aa.progressbar1.setProgress(int,true) endTime=System.currentTimeMillis() val dif=endTime-startTime Log.i("dif", "dif is : $dif ") progress1(1) } } }
日志信息:
dif is : 4118 dif is : 4102 dif is : 4103 dif is : 4103 dif is : 4096 dif is : 4091 dif is : 4084 dif is : 4095 dif is : 4074 dif is : 4075 dif is : 4064 dif is : 4067 dif is : 4060 dif is : 4072 dif is : 4047 dif is : 4058
问题根源
- 协程创建开销:每次进度更新都新建一个协程,100次更新就会创建100个协程,协程的创建与调度会产生额外耗时,累积后超出4秒的预期(100×40ms=4000ms)。
- 递归调用额外成本:递归调用本身会产生栈帧开销,加上协程切换的消耗,进一步拉长总耗时。
- 冗余条件判断:多层嵌套的
if判断增加了不必要的执行成本,虽然不影响逻辑,但会拖慢整体速度。
优化后的代码
private fun startProgress() { startTime = System.currentTimeMillis() coroTine.launch { repeat(100) { step -> val progress = step + 1 aa.progressbar1.setProgress(progress, true) // 计算预期已消耗时间,对比实际耗时,动态调整delay时长抵消误差 val expectedElapsed = progress * 40L val actualElapsed = System.currentTimeMillis() - startTime val delayTime = maxOf(0, expectedElapsed - actualElapsed) delay(delayTime) } endTime = System.currentTimeMillis() val dif = endTime - startTime Log.i("dif", "dif is : $dif ") // 如需循环执行,直接递归调用即可 startProgress() } }
优化说明
- 单协程执行:仅创建一个协程,通过
repeat循环处理所有进度更新,彻底消除大量协程创建和切换的开销。 - 实时误差修正:每次计算当前步骤的预期耗时与实际耗时的差值,动态调整
delay时长,抵消累计误差,让总耗时更接近4秒。 - 简化逻辑结构:去掉冗余的条件判断,代码更简洁,维护成本更低。
内容的提问来源于stack exchange,提问作者Rahimian
相关产品推荐
相关产品推荐

