暂停`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
我的应用程序从执行协程开始:
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