Androdi kotlin Coroutines(协程)详解 (三)

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} ")
            }
        }

你可能感兴趣的:(Androdi kotlin Coroutines(协程)详解 (三))