• 【深入理解Kotlin协程】使用Job控制协程的生命周期


    Job 是协程上下文 CoroutineContext的实现之一,通过它我们可以对协程的生命周期进行一些控制操作。
                
    Job 是协程的 句柄。使用  launch 或  async 创建的每个协程都会返回一个  Job 实例对象,该实例是相应协程的唯一标识并管理其生命周期。还可以将  Job 传递给  CoroutineScope 以进一步管理其生命周期,如以下示例所示:
    1. class ExampleClass {
    2.     ...
    3.     fun exampleMethod() {
    4.         // Handle to the coroutine, you can control its lifecycle
    5.         val job = scope.launch {
    6.             // New coroutine
    7.         }
    8.         if (...) {
    9.             // Cancel the coroutine started above, this doesn't affect the scope
    10.             // this coroutine was launched in
    11.             job.cancel()
    12.         }
    13.     }
    14. }

    我们通过Job可以获取当前协程的运行状态,还可以随时取消协程

    协程的状态查询:
    • isActive 活跃
    • isCompleted 已完成
    • isCancelled 已取消
    如果协程处于活跃状态,协程运行出错或者调用  job.cancel() 都会将当前任务置为取消状态 ( isActive = false, isCancelled = true)。当所有的子协程都完成后,协程会进入已完成状态,此时  isCompleted = true
        
    常用的协程操作:
    • cancel 用于Job的取消,取消协程
    • start 用于启动一个协程,让其到达 Active状态
    • invokeOnCompletion 添加一个监听,当工作完成或者异常时会调用
    • join 阻塞并等候当前协程完成

    start

    协程不是默认创建就启动了吗? 怎么还有一个 start 方法 。
    • 这个方法主要是针对通过懒加载 Lazy模式创建的协程,需要进行手动 start才能启动协程。
    1. val job = GlobalScope.launch(start = CoroutineStart.LAZY) {
    2.     println("执行在协程中..."
    3.     delay(1000L
    4.     println("执行完毕..."
    5. }
    6. job.start()

    cancel

    协程的取消,我们之前也讲到过,一般我们可以手动调用  cancel 或者在 onDestory的时候调用  cancel:
    1. var job = GlobalScope.launch { 
    2.     println("执行在协程中..."
    3.     delay(1000L)
    4.     println("执行完毕..."
    5. ...
    6. override fun onDestroy()
    7.     job.cancel()
    8.     super.onDestroy() 
    9. }

    invokeOnCompletion

    协程执行完的回调  invokeOnCompletion 也是我们常用的监听,在正常执行完毕,或者异常执行完毕都会回调这个方法。
    1. val exceptionHandler = CoroutineExceptionHandler { coroutineContext, throwable -> 
    2.     YYLogUtils.e(throwable.message ?: "Unkown Error"
    3. val job = GlobalScope.launch(Dispatchers.Main + exceptionHandler) { 
    4.   
  • 相关阅读:
    Flow Problem hdu 3549
    linux的常用命令
    22-08-26 西安 MySQL高级(04)索引失效、关联查询优化、排序分组优化、千万级数据分页的优化、Innodb的行锁
    【Python】标注库中os.path与pathlib中Path的比较
    Seata 使用
    使用新的 NVIDIA Isaac Foundation 模型和工作流程创建、设计和部署机器人应用程序
    有趣的设计模式——适配器模式让两脚插头也能使用三孔插板
    华为机试 - 过滤组合字符串
    微信公众号发送消息
    SPI学习笔记:DAC与ACD
  • 原文地址:https://blog.csdn.net/lyabc123456/article/details/127865614