Android中开启定时任务有几种方案:Timer、Handler、ScheduleExecutorService等。但ScheduleExecutorService应该是最推荐使用的,因为ScheduledExecutorService是将定时任务与线程池功能结合在了一起,任务是并发执行,互不影响。Timer的内部只有一个线程,如果有多个任务的话是顺序执行。那ScheduleExecutorService具体怎么用?
ScheduleExecutorService有3个方法执行定时任务:
schedule(runnable, delay, unit)
scheduleAtFixedRate(runnable, initialDelay, period, unit);
scheduleWithFixedDelay(runnable, initialDelay, delay, unit);
其中schedule(runnable, delay, unit)是指单次延时任务; scheduleAtFixedRate 和 scheduleWithFixedDelay 都是开启循环任务的方法,但两者时间在执行时间上有区别:scheduleAtFixedRate()按照上一次任务的发起时间作为开始时间计算下一次任务的开始时间,而scheduleWithFixedDelay()是以上一次任务的结束时间作为开始时间计算下一次任务的开始时间。
使用方法示例:
schedule:(5秒后执行线程)
ScheduledExecutorService mService = Executors.newScheduledThreadPool(5);
mService.schedule(new Runnable() {
@Override
public void run() {
System.out.println("-------单次任务执行--------");
}
}, 5, TimeUnit.SECONDS);
scheduleAtFixedRate:(1秒后执行线程,以后每隔5秒执行一次线程)(线程开始时间开始计时)
mService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try {
System.out.println("-------定期任务执行--------");
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, 1, 5, TimeUnit.SECONDS);
scheduleWithFixedDelay:(1秒后执行线程,以后每隔6秒执行一次线程)(线程结束时间开始计时)
mService.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
try {
System.out.println("-------定期任务执行--------");
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, 1, 5, TimeUnit.SECONDS);
关闭任务:
if (mService !=null && !mService.isShutdown()) {
mService.shutdown();
}
总结:
scheduleWithFixedDelay(runnable, initialDelay, delay, unit)第一次执行时间是initialDelay时间后,以后每次执行间隔是runnable任务执行完的时间加上delay的时间;scheduleAtFixedRate(runnable, initialDelay, period, unit)第一次执行时间是initialDelay时间后,以后每次执行间隔就是delay的时间,但这里有一种特殊情况,当period间隔的时间比runnable执行时间还要短的时候,period时间到了并不会立即执行,而是等runnable结束之后才立即执行下一次任务;