暂停`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)同意表是等待用户输入的模式弹出窗口,但是计时器一直在滴答作响。因此,在gdpr之后,用户可能会看到app starts too long错误。

是否可以暂停withTimeoutOrNull计时器并在一段时间后恢复计时器?

pkhisen 回答:暂停`withTimeout`

不立即提供支持,但是您可以编写自己的withTimeoutOrNull版本,该版本支持可暂停的计时器。关键思想是在单独的coroutineScope { ... }中运行您的代码块,并launch运行辅助助手协程,该协程将在超时后取消此作用域。现在,如果您一直引用此辅助程序cancellationJob,则可以在需要暂停时间时取消它,而在需要恢复计时器时重新启动它。

从本质上讲,您将获得与基本withTimeout相同的行为,但具有更多的可暂停性。实现withTimeoutOrNull变体需要一些额外的代码。您需要捕获取消异常并将其替换为空结果。

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

本文链接:https://www.f2er.com/3145170.html

大家都在问