我的应用从执行协程开始:
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
计时器并在一段时间后恢复计时器?
答案 0 :(得分:1)
不立即提供支持,但是您可以编写自己的withTimeoutOrNull
版本,该版本支持可暂停的计时器。关键思想是在单独的coroutineScope { ... }
中运行您的代码块,并launch
运行辅助助手协程,该协程将在超时后取消此作用域。现在,如果您一直引用此辅助程序cancellationJob
,则可以在需要暂停时间时取消它,而在需要恢复计时器时重新启动它。
从本质上讲,您将获得与基本withTimeout
相同的行为,但具有更多的可暂停性。实现withTimeoutOrNull
变体需要一些额外的代码。您需要捕获取消异常并将其替换为空结果。
可以在以下要点找到可行的实现:https://gist.github.com/elizarov/c5b0fde43ca14efbb8bcab13ad43c6ca