5.协程的取消

1.协程取消

一个用户关闭了一个启动了协程的界面,那么现在协程的执行结果已经不再被需要了,这就需要用到协程的取消, launch 函数返回了一个可以被用来取消运行中的协程的 Job

suspend fun main() {
    val job = GlobalScope.launch {
        repeat(1000) { i ->
            println("job: I'm sleeping $i ...")
            delay(500L)
        }
    }
    delay(1300L) // 延迟一段时间
    println("main: I'm tired of waiting!")
    job.cancel() // 取消该作业
    job.join() // 等待作业执行结束
    println("main: Now I can quit.")
}

2.协程作用域内取消的机制

取消一个协程作用域将同时取消此作用域下的所有子协程

suspend fun getResultOne():String{
    delay(1000)
    return "one"
}
suspend fun getResultTwo():String{
    delay(1000)
    return "two"
}
suspend fun main() {
    var job= Job()
    val scope= CoroutineScope(job)
    scope.launch {
        val job1 = launch {
            val resultOne = getResultOne()
            log(resultOne)
        }
        val job2 = launch {
            val resultTwo = getResultTwo()
            log(resultTwo)
        }
//        delay(500)
//        job1.cancel()
        log("three")
    }
//        .join()
    delay(100)
    job.cancel()
}

打印结果:

15:14:25:079 [DefaultDispatcher-worker-1,12] three

被取消的子协程不会影响到其他同级的协程
修改上面例子

suspend fun main() {
    var job= Job()
    val scope= CoroutineScope(job)
    scope.launch {
        val job1 = launch {
            val resultOne = getResultOne()
            log(resultOne)
        }
        val job2 = launch {
            val resultTwo = getResultTwo()
            log(resultTwo)
        }
        delay(500)
        job1.cancel()
        log("three")
    }
        .join()
    delay(100)
//    job.cancel()
}

打印结果:

15:13:21:282 [DefaultDispatcher-worker-1,12] three
15:13:21:757 [DefaultDispatcher-worker-1,12] two

在我们使用mvvm框架时候,在ViewModel 中我们可以使用viewModelScope,不需要我们自己创建,也不需要我们自己手动取消

你可能感兴趣的:(5.协程的取消)