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

取消协程Job后调用start()无法重启、isActive始终不为true是什么原因?

问题产生原因

Kotlin协程的Job是生命周期不可逆的一次性对象,仅能被启动一次,一旦被取消、执行完成或执行失败就会进入终态,无法复用。
你当前的代码在初始化阶段就提前创建了全局唯一的Job实例,第一次点击取消按钮调用job.cancel()后,该Job就进入了已取消的终态,后续再调用job.start()不会产生任何效果,isActive属性也会一直返回false。


修复方案

不要提前创建固定的Job实例,改为每次触发删除操作时创建新的Job,仅用全局变量存储当前正在执行的Job引用即可:

  1. 变量定义修改为只存储Job引用:
// 不要提前创建Job,仅保留当前执行任务的引用
private var removeJob: Job? = null
  1. 修改onRemoveProduct逻辑,每次触发时创建新Job:
override fun onRemoveProduct(product: Product) {
    // 可选:如果需要避免多次点击触发多个任务,先取消之前的任务
    removeJob?.cancel()
    removeJob = CoroutineScope(Dispatchers.Default).launch {
        delay(THREE_SECONDS)
        if (isActive) {
            listener?.removeProduct(product)
        }
    }
}
  1. 取消逻辑保持不变,取消后可以手动置空引用释放资源:
override fun onClick(v: View?) {
    when(v?.id) {
        R.id.dismissBtn -> {
            removeJob?.cancel()
            removeJob = null
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:54:07