运行 作业超过 10 秒时的协程回调
coroutine callback when running job is longer than 10 seconds
协程本身就是为了减少回调而诞生的,这很奇怪
嗯,我没有找到任何相关问题,但是如果有的话请在这里提出
假设我有这个代码
lifecycleScope.launch {
hitApi()
}
我想在方法 hitApi()
花费的时间超过 10 秒时进行回调,因此 activity 会调用一些操作,例如
onHitApiLongerThanTenSeconds() {
showToast("hit api is taking longer than expected")
}
所以...可能吗?
我知道有measureTimeMillis
方法但是这个值是在作业完成后返回的,cmiiw。
提前致谢
[编辑]
我不希望 hitApi
方法在调用回调时被取消,只需继续该过程直到我收到响应或达到一般最大超时,如 30 秒或 60 秒
您可以用 withTimeout
块包装您的调用。如果它的块花费的时间比它的参数长,它将抛出 TimeoutCancellationException
。
lifecycleScope.launch {
try {
withTimeout(10_000) {
hitApi()
}
} catch (e: TimeoutCancellationException) {
onHitApiLongerThanTenSeconds()
}
}
或者,如果您希望从 hitApi
方法得到一个值 return,您可以使用 withTimeoutOrNull
如果它的块需要更长的时间,它将 return null
比它的参数:
val value = withTimeoutOrNull(10_000) {
hitApi()
}
if (value == null) {
onHitApiLongerThanTenSeconds()
}
也许这行得通(未测试):
lifecycleScope.launch {
supervisorScope { // or coroutineScope
val toastJob = launch {
delay(10000L)
showToast("hit api is taking longer than expected")
}
hitApi()
toastJob.cancel()
}
}
协程本身就是为了减少回调而诞生的,这很奇怪
嗯,我没有找到任何相关问题,但是如果有的话请在这里提出
假设我有这个代码
lifecycleScope.launch {
hitApi()
}
我想在方法 hitApi()
花费的时间超过 10 秒时进行回调,因此 activity 会调用一些操作,例如
onHitApiLongerThanTenSeconds() {
showToast("hit api is taking longer than expected")
}
所以...可能吗?
我知道有measureTimeMillis
方法但是这个值是在作业完成后返回的,cmiiw。
提前致谢
[编辑]
我不希望 hitApi
方法在调用回调时被取消,只需继续该过程直到我收到响应或达到一般最大超时,如 30 秒或 60 秒
您可以用 withTimeout
块包装您的调用。如果它的块花费的时间比它的参数长,它将抛出 TimeoutCancellationException
。
lifecycleScope.launch {
try {
withTimeout(10_000) {
hitApi()
}
} catch (e: TimeoutCancellationException) {
onHitApiLongerThanTenSeconds()
}
}
或者,如果您希望从 hitApi
方法得到一个值 return,您可以使用 withTimeoutOrNull
如果它的块需要更长的时间,它将 return null
比它的参数:
val value = withTimeoutOrNull(10_000) {
hitApi()
}
if (value == null) {
onHitApiLongerThanTenSeconds()
}
也许这行得通(未测试):
lifecycleScope.launch {
supervisorScope { // or coroutineScope
val toastJob = launch {
delay(10000L)
showToast("hit api is taking longer than expected")
}
hitApi()
toastJob.cancel()
}
}