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

如何取消尚未启动的TimerTask,阻止其执行?

如何取消未执行的TimerTask

你当前代码里调用time.cancel()会直接终止整个Timer实例,导致后续无法再用这个Timer调度任务,而且没法精准取消单个待执行的任务。要实现取消特定的TimerTask,需要保存任务的引用,然后调用任务自身的cancel()方法。

修改后的代码示例

val timer = Timer("Timer", false)
// 保存待执行任务的引用
var scheduledTask: TimerTask? = null

fun test() {
    Timber.tag("COMPOSABLE24").d(fingerprintFingerCount.name)
    if (fingerprintFingerCount.name == FingerprintScanStatus.ScanFew.name) {
        Timber.tag("COMPOSABLE2").d("Manger encore")
    }
}

// 根据状态处理任务调度/取消
when(fingerprintFingerCount.name) {
    FingerprintScanStatus.ScanFew.name -> {
        Timber.tag("COMPOSABLE2").d("Manger")
        // 先取消之前可能存在的任务,避免重复触发
        scheduledTask?.cancel()
        // 创建并保存新任务
        scheduledTask = object : TimerTask() {
            override fun run() {
                test()
            }
        }
        // 调度任务
        scheduledTask?.let { timer.schedule(it, 5000) }
    }
    FingerprintScanStatus.ScanNotStarted.name -> {
        // 取消单个待执行任务
        scheduledTask?.cancel()
        scheduledTask = null
        // 如果后续不再使用该Timer,可以取消整个Timer:
        // timer.cancel()
    }
}

关键说明

  • 保存任务引用:用var scheduledTask: TimerTask?持有要执行的任务,这样可以精准控制单个任务的取消操作,而不是终止整个Timer。
  • 避免重复调度:在创建新任务前先取消旧任务,防止同一状态多次触发导致多个任务排队执行。
  • 任务置空:取消任务后将变量置为null,避免持有无效引用。
  • Timer生命周期:如果后续不再需要该Timer实例,再调用timer.cancel();如果还需要复用Timer,仅取消单个任务即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 01:25:16