Androdi kotlin Coroutines(协程)详解 (一)
Androdi kotlin Coroutines(协程)详解 (二)
Androdi kotlin Coroutines(协程)详解 (三)
Androdi kotlin Coroutines(协程)详解 (四)
Androdi kotlin Coroutines(协程)详解 (五)
Androdi kotlin Coroutines(协程)详解 (六)
三、协程的取消与超时
3.1 协程取消
作业可以被安排到父-子层次结构中,在这种层次结构中,取消一个父节点将导致立即递归地取消其所有子节点。如果一个子节点出现 CancellationException 以外的异常而失败,则会立即取消它的父节点,并因此取消它的所有其他子节点。一般调用 job.cancel() 方法取消协程。这里也有一个可以使 Job 挂起的函数 cancelAndJoin 它合并了对 cancel 以及 join 的调用。
GlobalScope.launch {
val job = launch {
repeat(1000) { i ->
Log.d(TAG, "job: I'm sleeping $i ...")
delay(500L)
}
}
delay(1300L) // 延迟一段时间
Log.d(TAG, "main: I'm tired of waiting!")
job.cancel() // 取消该作业
job.join() // 等待作业执行结束
Log.d(TAG, "main: Now I can quit.")
}
如果在父节点取消
val job = GlobalScope.launch {
val job = launch {
repeat(1000) { i ->
Log.d(TAG, "job: I'm sleeping $i ...")
delay(500L)
}
}
Log.d(TAG, "main: I'm tired of waiting!")
job.join() // 等待作业执行结束
}
Thread.sleep(1300)
Log.d(TAG, "main: I'm cancel!")
job.cancel()
}
3.2 协程超时
withTimeout 函数,注意要trycatch,会抛出一个TimeoutCancellationException异常
GlobalScope.launch {
try {
withTimeout(1300) {
repeat(1000) { i ->
Log.d(TAG, "I'm sleeping $i ...")
delay(500L)
}
}
} catch (e: TimeoutCancellationException) {
e.printStackTrace()
Log.d(TAG, "Exception ${e.message} ")
}
}