运行 作业超过 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()
        }
    }