取消协程Job后调用start()无法重启、isActive始终不为true是什么原因?
问题产生原因
Kotlin协程的Job是生命周期不可逆的一次性对象,仅能被启动一次,一旦被取消、执行完成或执行失败就会进入终态,无法复用。
你当前的代码在初始化阶段就提前创建了全局唯一的Job实例,第一次点击取消按钮调用job.cancel()后,该Job就进入了已取消的终态,后续再调用job.start()不会产生任何效果,isActive属性也会一直返回false。
修复方案
不要提前创建固定的Job实例,改为每次触发删除操作时创建新的Job,仅用全局变量存储当前正在执行的Job引用即可:
- 变量定义修改为只存储Job引用:
// 不要提前创建Job,仅保留当前执行任务的引用 private var removeJob: Job? = null
- 修改
onRemoveProduct逻辑,每次触发时创建新Job:
override fun onRemoveProduct(product: Product) { // 可选:如果需要避免多次点击触发多个任务,先取消之前的任务 removeJob?.cancel() removeJob = CoroutineScope(Dispatchers.Default).launch { delay(THREE_SECONDS) if (isActive) { listener?.removeProduct(product) } } }
- 取消逻辑保持不变,取消后可以手动置空引用释放资源:
override fun onClick(v: View?) { when(v?.id) { R.id.dismissBtn -> { removeJob?.cancel() removeJob = null } } }
内容的提问来源于stack exchange,提问作者SNM
相关产品推荐
相关产品推荐

