Android线程—Timer类(四)

时间:2022-12-03 14:36:58

Timer类的schedule方法的TimerTask任务队列是排队运行的,那么任务队列怎么清除呢?

用的是cancel方法,而TimerTask和Timer都有cancel的方法,下面看下这两种的示例。

  • TimerTask类的cancel方法

TimerTask类中的cancel方法的作用是将自身从任务队列中清除,既然是TimerTask类的方法,那么就是在TimerTask的子类中调用,下面请看示例。

Android线程—Timer类(四)

两个队列,一个调用cancel

在任务里一个任务调用cancel方法,另外一个不调用,用来作对比,下面请看测试结果。

Android线程—Timer类(四)

清除队列

从结果中可以看到,MyTask1任务只运行一次就从任务队列里面清除,而其他任务(MyTask2)则不受影响。

  • Timer类的cancel方法

Timer类的cancel方法的作用是将任务队列中的全部任务清空。下面看下示例代码。

Android线程—Timer类(四)

Timer的cancel方法

在这边要注意的是,如果timer.cancel()方法放在timer.schedule(mt1, dateByStr, 4000)代码之前的话,运行的话就会报错,因为还没开始就结束了。具体可以看下源代码哪里报的异常。

从这边结果可以看到,调用timer.cancel()方法之后,任务就被清除了,进程也结束了,这边没把运行的进程截下来,大家可以打打代码看下,此时的按钮已经变灰,也就是进程已经结束。

但是这边使用Timer类的cancel方法的时候也要注意,有时候并没有争抢到队列锁的时候,也是会使队列任务正常执行,下面看下简单的实例代码。

Android线程—Timer类(四)

测试结果

可以看到有些timer类还是执行了。所以在调用timer的cancel的时候需要注意。