很多开发者以为只要调用cancel就能彻底停掉定时任务,实际线上经常遇到两种诡异现象:一是调用Timer.cancel后再schedule直接抛IllegalStateException,二是明明调用了TimerTask.cancel,Activity还是被泄漏引用。根源在于Timer和TimerTask的cancel语义完全不同,一个终止整个调度器,一个只标记单个任务。搞清源码层面的差异,才能避免踩坑。
Timer.cancel会终止这个计时器,丢弃所有当前已安排的任务,但不会干扰正在执行的任务,如果此时有任务正在跑,它会继续执行完。
一旦计时器终止,它的执行线程会正常退出,之后不能再往这个Timer上安排任何任务。如果继续schedule,就会抛出Timer was canceled之类的IllegalStateException。
该方法可以重复调用,第二次及以后的调用没有效果。
在任务run方法内部调用Timer.cancel,可以绝对保证当前正在执行的任务是这个Timer执行的最后一个任务。
默认情况下Timer的任务执行线程不是守护线程,能够阻止应用程序退出,如果想快速终止这个线程,就应该调用Timer的cancel。这也是很多程序不退出、线程常驻的常见原因。
TimerTask.cancel只取消当前这一个任务。如果任务是一次性执行且还没运行,或者还没被调度,它就永远不会运行;如果是周期任务,则不会再执行下一次。如果调用时任务正在运行,任务会跑完,但不会再重复。
从源码看,TimerTask.cancel只是把内部state改成CANCELLED并返回结果,并没有把任务从队列里移除。所以它不会影响同一个Timer里的其他任务,其他任务照常执行。
因为任务还留在队列里,外部如果持有引用,就可能造成临时内存泄漏。TimerThread只有在取到队首任务且发现状态是已取消时才会清理,如果时间没到又没有新任务进来,清理就不会发生,从而出现临时泄漏。
同一个TimerTask不能重复schedule,被cancel后也不能直接重新调度,否则会抛TimerTask is scheduled already或已取消相关异常,必须重新new一个TimerTask。
想恢复被取消的周期任务,通常只能重建Timer和TimerTask,不能指望原来的对象继续跑。
Timer.purge会从任务队列中移除所有已取消的任务,它不影响Timer本身的行为,但会去掉队列对已取消任务的引用,如果没有外部引用,这些任务就可以被垃圾回收。
官方说明大部分程序不需要调用purge,它主要是为取消大量任务的少数应用设计的,调用它属于用时间换空间,运行时间可能与队列任务数和已取消任务数相关。
实践中常见清理套路是先cancel再purge,最后把Timer和TimerTask引用置空,有助于减少残留引用。
Android里如果TimerTask是匿名内部类,会隐式持有Activity引用,即使调用了cancel,只要引用链还在就可能泄漏,建议用静态内部类加弱引用,或者在onDestroy里彻底取消并置空。
更推荐用生命周期感知方案,比如Kotlin协程配合viewModelScope或lifecycleScope,组件销毁自动取消,比手动维护Timer省心很多。
Timer是单线程串行执行,某个任务耗时过长会独占执行线程,导致后续任务延迟,甚至堆积后快速连续执行。
Timer不会捕获任务抛出的未检查异常,一旦抛出会终止Timer线程,已安排未执行的任务永远不会再跑,新任务也无法调度。因此run方法里一定要自己try-catch兜住异常。
Timer调度基于系统绝对时间,系统时间被手动修改或NTP校准会影响调度,而ScheduledExecutorService基于相对时间,不受影响。
ScheduledExecutorService基于线程池,任务之间不容易互相阻塞,支持Future取消和获取结果,异常隔离更好,通常更适合作为替代方案。
需要跨进程、设备休眠后依然触发的场景,应该用AlarmManager或WorkManager,Timer无法保证。
![]()
Timer.cancel是终止整个调度器,清空已排队任务,让执行线程退出,并且之后不能再schedule,重复调用无效;TimerTask.cancel只把单个任务标记为取消,不影响其他任务,也不会立刻把任务从队列移除,可能带来临时内存泄漏。purge负责清理队列中已取消任务的引用,帮助回收,但大多数程序不需要频繁调用。
声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com
包含研学创作(大纲)和研学创作(全文)
通过请求综述题目、指定文献ID集合、生成模式及学科名称,以流式方式返回生成的调研综述全文及引用的参考文献信息。
通过请求问题内容、学科名称及选题目的,返回包含中英文题目、推荐理由、多维度评分及相似文献的智能选题推荐结果。
通过自然语言请求,选择以流式或非流式方式返回模型生成的对话回复及相关的参考文献引用信息。
包含会议文献和会议文献详情