美文网首页
5.协程的取消

5.协程的取消

作者: 学吉他的袁先生 | 来源:发表于2020-08-08 10:07 被阅读0次

    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.协程的取消

          本文链接:https://www.haomeiwen.com/subject/lpncdktx.html