在Android的项目开发过程中,我们经常会用到定时计时功能,本文今天大题整理下这方面的知识技术。聊做总结。
方案一、Timer+TimerTask实现:
这个方案相比无聊时Java开发者还是Android开发者,都是熟悉得不能再熟悉了。不多说,简单的几行代码做介绍就行:
Timer timer = new Timer();
timer.schedule(timerTask, 10, 3);
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
// TODO:
}
};
不过这个方案,在Android中使用的时候要注意一下场景下的异常,关于场景介绍以及解决方案见这里《Timer+TimerTask异常》不再累述
方案二、Handler+Runnable实现:
Handler mHandler = new Handler();
mHandler.postDelayed(runnable, 10 * 1000);
Runnable runnable = new Runnable() {
@Override
public void run() {
//TODO:延时要干的其他事情
//循环定时最关键的一行代码:前面调用mHandler.postDelayed后,程序开始延时操作,执行完后,又在这里调用了自己给自己发一条延时消息这样在线程里面就形成一个循环(死循环)
mHandler.postDelayed(runnable, 10 * 1000);
}
};
在需要的地方执行下面的代码,取消定时循环的持续进行:
mHandler.removeCallbacks(runnable);
方案三、RxJava2框架下的Timer功能:
这个方案使用起来超方便,加上RxJava2现在本身火的一塌糊涂,所以使用这个方案,开发的逼格瞬间爆棚,牛逼得不要不要的。
Observable.timer(4, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(Long aLong) throws Exception {
// TODO:
}
});
方案四、Timer+TimerTask组合的升级版ScheduledExecutorService:超级好使,不信你看:
ScheduledExecutorService executorService01 = new ScheduledThreadPoolExecutor(2);
// schedule方法调度的任务在delay时长的延迟后只执行一次。
executorService01.schedule(runnable , 3, java.util.concurrent.TimeUnit.SECONDS);
ScheduledExecutorService executorService02 = new ScheduledThreadPoolExecutor(3);
// scheduleAtFixedRate:该方法在initialDelay时长后第一次执行任务,以后每隔period时长,再次执行任务。
// 注意,period是从任务开始执行算起的。开始执行任务后,定时器每隔period时长检查该任务是否完成,
// 如果完成则再次启动任务,否则等该任务结束后才再次启动任务。
executorService02.scheduleAtFixedRate(runnable , 3, 3, TimeUnit.SECONDS);
ScheduledExecutorService executorService03 = new ScheduledThreadPoolExecutor(3);
// 该方法在initialDelay时长后第一次执行任务,以后每当任务执行完成后,等待delay时长,再次执行任务。
executorService03.scheduleWithFixedDelay(runnable , 3, 3, TimeUnit.SECONDS);
ScheduledExecutorService executorService04 = new ScheduledThreadPoolExecutor(3);
executorService04.execute(runnable );
Runnable runnable = new Runnable() {
@Override
public void run() {
// TODO:
}
};
然后在需要的地方销毁executorService,避免内存泄漏。
executorService01.shutdown();
executorService02.shutdown();
executorService03.shutdown();
executorService04.shutdown();
使用起来是不是超简单?
好了,先总结到这里了。