嘿,所以我试图添加一个超时到我的请求,但它从来没有火这里是我如何调用挂起乐趣:
getSettingJob = CoroutineScope(Dispatchers.IO).launch {
getSettings(this@MainActivity)
}
这是实际的函数
suspend fun getSettings(context: Context?) {
Timber.i(" Request started ")
CoroutineScope(Dispatchers.Main).async(Dispatchers.Main) {
try {
withTimeout(120000L) {... do stuff}
}catch(ex : TimeoutCancellationException) {
... show error message
}
}.await()
}
我没有收到任何错误,超时只是从来没有触发,这是否与作业在IO上启动和协程范围是主或异步等待的事实有关?两者都说他们是可取消的,所以不确定这应该是它。
1条答案
按热度按时间jk9hmnmh1#
协程消除是协作的。
https://kotlinlang.org/docs/cancellation-and-timeouts.html#cancellation-is-cooperative
如果协程没有到达挂起点(例如,如果线程被阻塞),它将不会被取消。
要使取消信号到达具有阻塞线程的协程,请使用
runInterruptible
。https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-interruptible.html