You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin协程中CancelAndJoin()用法疑问:为何未自我取消?

关于Kotlin协程cancelAndJoin()的用法解释

这段代码的核心作用是确保同一时间只有一个该协程实例在运行,每次启动新协程前都会先终止上一个(如果存在的话),你的误解在于没搞清楚job变量的赋值时机:

  1. 第一次执行这段代码时:

    • job初始值为null,所以job?.cancelAndJoin()这行代码会被跳过(安全调用运算符?.在对象为null时不执行后续方法)。
    • 随后协程进入while(isActive)循环,开始执行任务,同时job变量会被赋值为当前这个协程的Job实例。
  2. 第二次及之后执行这段代码时:

    • job此时指向的是上一次启动的协程的Job对象,job?.cancelAndJoin()会被执行:它会取消上一个协程,并且等待上一个协程彻底结束(比如完成当前循环迭代、在delay处响应取消信号)。
    • 等旧协程完全终止后,当前新协程才会进入while(isActive)循环开始执行任务,同时job变量被更新为当前新协程的Job。

简单说,这段代码是避免重复启动相同任务的常用写法:每次触发时先停掉之前的任务,再启动新的,不会出现新协程刚启动就自我取消的情况,因为第一次执行时cancelAndJoin()根本没运行,后续执行时取消的是旧协程,不是自己。

示例代码:

job = viewModelScope.launch {
        job?.cancelAndJoin()
        while (isActive) {
            //do some work
            delay(1000L)
        }
    }

内容的提问来源于stack exchange,提问作者KvdLingen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:20:31