暂停`withTimeout`

Suspend `withTimeout`

我的应用程序从执行协程开始:

model.viewModelScope.launch(Dispatchers.IO) {
            val timeout = withTimeoutOrNull(TIMEOUT) {
            //send some initialization server requests
            true   //timeout=true
    }
    if (timeout!=null){
        // app started ok
    } else {
        // app freezed on start
    }
}

问题出在初始化步骤之一 - 获得用户同意共享其个人数据 (GDPR) 同意书是一个模式弹出窗口,等待用户 input.But 计时器一直在滴答作响。因此在 gdpr 之后用户可能会看到 app starts too long 错误。

有没有办法暂停 withTimeoutOrNull 计时器并在一段时间后恢复?

它不受开箱即用的支持,但您可以编写自己的 withTimeoutOrNull 版本来支持可暂停计时器。关键的想法是 运行 你的块在一个单独的 coroutineScope { ... }launch 一个辅助协程,它会在超时后取消这个范围。现在,如果您保留对这个助手 cancellationJob 的引用,那么您可以在需要暂停时间时取消它,并在需要恢复计时器时重新启动它。

这会给你带来与基本 withTimeout 基本相同的行为,但增加了可暂停性。需要一些额外的代码来实现 withTimeoutOrNull 变体。您需要捕获取消异常并将其替换为空结果。

可以在这个要点中找到一个可行的实现:https://gist.github.com/elizarov/c5b0fde43ca14efbb8bcab13ad43c6ca