前言
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