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

本文深入探讨了Kotlin协程的生命周期管理,重点讲解了如何使用Job控制协程的启动、取消、监听完成和join操作。通过实例展示了cancel、start、invokeOnCompletion和join的方法用法,强调了协程取消的协作性质,以及在协程中检查Job状态的方法。此外,还讨论了Deferred接口在处理带结果的Job时的应用,以及协程取消可能带来的副作用和无法取消的任务场景。
摘要由CSDN通过智能技术生成
Job 是协程上下文 CoroutineContext的实现之一,通过它我们可以对协程的生命周期进行一些控制操作。
            
Job 是协程的 句柄。使用  launch 或  async 创建的每个协程都会返回一个  Job 实例对象,该实例是相应协程的唯一标识并管理其生命周期。还可以将  Job 传递给  CoroutineScope 以进一步管理其生命周期,如以下示例所示:
class ExampleClass {
    ...
    fun exampleMethod() {
        // Handle to the coroutine, you can control its lifecycle
        val job = scope.launch {
            // New coroutine
        }
        if (...) {
            // Cancel the coroutine started above, this doesn't affect the scope
            // this coroutine was launched in
            job.cancel()
        }
    }
}

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

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

start

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

cancel

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

invokeOnCompletion

协程执行完的回调  invokeOnCompletion 也是我们常用的监听,在正常执行完毕,或者异常执行完毕都会回调这个方法。
val exceptionHandler = CoroutineExceptionHandler { coroutineContext, throwable -> 
    YYLogUtils.e(throwable.message ?: "Unkown Error") 
} 
val job = GlobalScope.launch(Dispatchers.Main + exceptionHandler) { 
    println("执行在另一个协程中.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

川峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值