Android 开发 Timer与TimerTask

前言

  google在Android上提供了很多个关于时间的操作类,比如长时间的定时操作可以使用AlarmManager 定时器,而中等时间和短时间的定时操作就依靠Timer与TimerTask来实现.其实Timer与TimerTask的用法很简单并没有可以多说的,直接看代码即可.

简单的Demo

有一点要注意TimerTask的run()是在子线程的.

private void timeTask(){
        TimerTask timerTask = new TimerTask() { //创建定时触发后要执行的逻辑任务
            @Override
            public void run() {
               runOnUiThread(new Runnable() {
                   @Override
                   public void run() {
                       Toast.makeText(MainActivity.this, "触发TimerTask", Toast.LENGTH_SHORT).show();
                   }
               });

            }
        };
        
        Timer timer = new Timer();
        timer.schedule(timerTask, 5*1000); //启动定时任务
        
    }

TimerTask API介绍

仅有三个拉出来说明一下

        timerTask.scheduledExecutionTime();//返回这个任务的预定执行时间
        timerTask.cancel();//取消,取消这个任务
        timerTask.run();//执行run(); 差不多就是立即执行任务了

Timer API介绍

        timer.cancel();//取消这个定时器,但是不停止正在执行的任务,停止后此定时器无法在添加TimerTask任务(线程被关闭了)
        timer.purge();//清除TimerTask任务,从此计时器的任务队列中删除所有已取消的任务,调用此方法对计时器的行为没有影响
        timer.scheduleAtFixedRate(timerTask, 5*1000, 10*1000);//重复执行任务,第二个参数为延迟执行任务的时间,第三个参数为后续重复任务的延迟时间

请注意 timer.cancel(); 这里的取消是取消定时器与取消任务是不一样的..

一些坑

  1.Timer 定时器,在定时长时间任务的情况下就会开始出现不准确或者不触发推迟很久触发的问题。能准确触发是根据设备是否睡眠的情况而定的,如设备未睡眠那么30分钟内的都是相对准确的,但是不保证大于30分钟是否准确。 而如果设备已经睡眠,只要睡过去了大概就根据Doze模式的周期触发定时器了。定时越长越不准确并可能被延迟的越长或者干脆不触发。  以上是我个人在项目实际情况下的经验之谈。 我在物联设备项目里,我们的物联设备关闭了Doze模式,但是原生的Android系统依然会有自带睡眠功能(这个自带的睡眠可以被一直打扰唤醒,没有Doze模式这么强规则),如果你设定一个3小时后的任务,那么基本上是不会触发这个任务的。 而设置30分钟左右的任务还是能够准确触发。 所以结论是如果长时间的定时任务还是交给AlarmManager来完成。 而30分钟内的定时任务并且设备不会睡眠的情况下可以交给Timer来完成,如果是10分钟 5分钟的短定时 完全就可以交给它来完成定时任务了。

end

原文地址:https://www.cnblogs.com/guanxinjing/p/10301111.html