Kotlin Suspend`withTimeout`

Kotlin Suspend`withTimeout`,kotlin,timer,kotlin-coroutines,Kotlin,Timer,Kotlin Coroutines,我的应用程序从执行协同程序开始: model.viewModelScope.launch(Dispatchers.IO) { val timeout = withTimeoutOrNull(TIMEOUT) { //send some initialization server requests true //timeout=true } if (timeout!=null){ // ap

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

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同意表是一个模式弹出窗口,等待用户输入。但计时器一直在滴答作响。所以gdpr后用户可能会看到应用程序启动时间过长的错误


有没有办法暂停WithTimeout或Full timer并在一段时间后恢复?

不支持开箱即用,但您可以编写自己的WithTimeout或Full版本,以支持可暂停计时器。关键思想是在一个单独的协同作用域{…}中运行您的块,并启动一个辅助辅助协同作用域,该协同作用域将在超时后取消该作用域。现在,如果您保留对该助手cancellationJob的引用,则可以在需要暂停时间时取消它,并在需要恢复计时器时重新启动它

这将为您提供与basic withTimeout基本相同的行为,但增加了可暂停性。实现WithTimeOutorFull变量需要一些额外的代码。您需要捕获取消异常并将其替换为空结果


可以在以下要点中找到已制定的实施方案:

如果我理解正确,您希望仅在用户同意后运行此协同程序?那么用户在应用程序中看到的第一件事将是gdpr同意。用户过期率不好。我认为必须有两个协同过程:同意前后。我希望有更简单的解决方法。你可以放心,没有办法暂停计时器。实现计划一个取消任务,你给它的延迟。嘿,罗曼,它非常适合!我刚刚用TimeOutorNull->pauseableWithTimeoutOrNull替换。顺便说一句:依赖时钟不是最好的主意。用户可以传输它。你能解释一下这个参数的作用吗?block:suspend TimerScope。->T.我猜这是主协同程序的主体。一个lambda。那么什么是TimerScope?我可以在这个lambda中看到这个=TimerScopeImpl。这怎么可能?我以为lambda没有它们的作用域并继承父对象的作用域。找到了!它的接收器类型