如何取消尚未启动的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
相关产品推荐
相关产品推荐

