【问题标题】:Repeatedly call function with postDelayed() for n times使用 postDelayed() 重复调用函数 n 次
【发布时间】:2021-10-19 06:02:41
【问题描述】:

我目前正在开发一个使用 handler.postDelayed() 的计时器功能

我想在完成n 次后调用相同的函数。

即我想重复一个延迟函数 n 次。

函数示例代码:

fun delayProgress(...){
        
        handler.postDelayed({
            ......
        }, 1000)

        handler.postDelayed({
            ....
        }, 2000)
        handler.postDelayed({
            ...
        }, 3000)
       
    }

我尝试过的事情:

Kotlin 协程

使用 repeat() 运行阻塞

延迟()

编辑 1:

runBlocking {  
            launch {
                repeat(3) {
                    delayProgress(...)
                    delay(3000)
                }
            }
        }

上面的代码没有按预期运行,delay() 阻塞 UI 3 秒,释放时函数 delayProgress() 跳过 3 秒并并行执行 3 次,而不是顺序执行。

【问题讨论】:

  • 所以你想打电话给delayProgress n 次?
  • yourScope.launch { repeat(n) { yourFunction(); delay(1000) } } 必须工作。您说您“尝试过”它,也许您应该发布您曾经尝试过的代码。
  • 阻塞用户界面的不是delay(),而是runBlocking——正如它的名字所说。您需要删除它并使用适当的范围对象(与您正在执行此操作的 UI 组件的生命周期相关的对象)。要尝试一下,您可以使用 GlobalScope.launch(Dispatchers.Main) 作为临时方法。

标签: android kotlin delay kotlin-coroutines coroutine


【解决方案1】:

如果你想使用postDelayed,你可以这样做

val n = 3
repeat(n) { i -> handler.postDelayed({ ... }, (i+1) * 1000 }

在您的协程示例中,您使用的是runBlocking,因此您启动的协程将阻塞线程。你的代码正在做的是调用delayProgress(它会向消息队列发布一堆runnables)然后阻塞三秒钟。

一旦延迟结束,三秒过去了,所有可运行文件都(过期)到期了,所以它们都会立即得到处理。

我不太确定你在做什么 - 将可运行文件发布到处理程序是推迟工作的一种方式,协程是另一种方式。您将两者结合起来执行一项任务 9 次。您在这里的用例是什么?

使用 runnables 执行此操作的典型方法是在 runnable 执行时延迟自身重新发布(或创建新的 runnable),并让它检查是否应该这样做(例如,给它一个可以递减的计数器,所以它只会触发 3 次,或者设置一个启动/停止标志)

【讨论】:

    猜你喜欢
    • 2020-01-18
    • 2013-09-07
    • 2019-02-09
    • 2023-03-16
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2011-11-13
    相关资源
    最近更新 更多