【问题标题】:android coroutines delay() sometime delays longer than specifiedandroid coroutines delay() 有时延迟比指定的长
【发布时间】:2020-05-14 21:16:42
【问题描述】:

注意到 delay() 有时需要比指定时间更长的时间

        launch {
            val start = System.currentTimeMillis()
            delay(15)
            val now = System.currentTimeMillis()
            Log.d("TAG", "delayed: ${now - start}")
            doSomeThing()
        }

日志显示有几次延迟需要 27 毫秒,20 毫秒虽然大部分时间是 15 毫秒。 这是一种已知的行为吗?有什么更准确的方法来做同样的事情?

【问题讨论】:

    标签: delay kotlin-coroutines


    【解决方案1】:

    它不仅是已知的,而且是普遍的行为,与delay 具体无关。应用程序代码可以随时被操作系统挂起,出现 GC 暂停、IO 中断等。使用delay,您还需要了解调度程序的精确实现细节以及调度任务的精确度。

    delayThread.sleep 或任何其他类似功能一样,保证会延迟至少您指定的时间。

    【讨论】:

    • 似乎协程 delay() 比使用 android postDelayed() 有更长的时间(看到一些上升超过 100 毫秒)。也许使用 postDelayed() 更好?
    • 这是Dispatchers.Main.delay()的实现:val block = Runnable { with(continuation) { resumeUndispatched(Unit) } } handler.postDelayed(block, timeMillis.coerceAtMost(MAX_DELAY)); continuation.invokeOnCancellation { handler.removeCallbacks(block) } 所以我怀疑会有区别。
    猜你喜欢
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 2012-10-16
    • 2011-03-29
    • 2019-06-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多