You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 08:10:20