原文:https://blog.csdn.net/weixin_40420578/article/details/103876900
一.倒计时(3、2、1)
- CountDownTimer()
- //一共3秒,每隔1秒执行一次
- CountDownTimer timer = new CountDownTimer(3000, 1000) {
- @Override
- public void onTick(long millisUntilFinished) {
- //还剩下多少秒millisUntilFinished/1000,依次为2、1、0
- }
- @Override
- public void onFinish() {//结束后的操作
- }
- }.start();
二.定时器
1.Timer:完整定时任务需要由Timer、TimerTask两个类来配合完成。Timer是一种定时器工具,用来在一个后台线程计划执行指定任务,而TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。
计算下一次执行时间:当前时间(在任务执行前得到) + 时间片(实际时间)
缺陷:Timer对调度的支持是绝对时间,不会捕获异常,当TimerTask抛出异常导致Timer线程终止,Timer不会恢复,把整个线程取消。内部是单一线程
- 公共的
- //当前时间往后1分钟,eg:现在11:11:11,那么得到的是11:12:11(举例的是时分秒)
- long currentTime = System.currentTimeMillis() + 1 * 60 * 1000;
- Date date = new Date(currentTime);
- Timer timer=new Timer();
- timer.cancel();//取消定时器
- 指定时间执行一次(当前时间1分钟后执行一次)
- timer.schedule(new TimerTask() {
- @Override
- public void run() {
- //要做的事情M
- }
- },date);
-
延时执行一次(1秒后执行一次)
- timer.schedule(new TimerTask() {
- @Override
- public void run() {
- //要做的事情M
- }
- },1000);
-
指定时间开始执行,执行完后等2秒再进行下一次,以此类推一直循环
- timer.schedule(new TimerTask() {
- @Override
- public void run() {
- //要做的事情M
- }
- },date,2000);
-
延时1秒后开始执行,执行完后等2秒再进行下一次,以此类推一直循环
- timer.schedule(new TimerTask() {
- @Override
- public void run() {
- //要做的事情M
- }
- },1000,2000);
2.ScheduledExecutorService(推荐使用):是将定时任务与线程池功能结合在了一起,任务是并发执行,互不影响
计算下一次执行的时间:当前需要执行的时间(也就是计算出现在应该执行的时间)+ 时间片
优点:ScheduledExecutorService对调度的支持是相对时间(前一个执行结束后相隔多少秒再执行下一个),内部是个线程池
- 公共的
- ScheduledExecutorService service= Executors.newScheduledThreadPool(10);//线程池数
- service.shutdown();//取消定时器
- schedule延时执行一次
- service.schedule(new Runnable() {
- @Override
- public void run() {
- //要做的事情M
- }
- },1, TimeUnit.SECONDS);//TimeUnit.SECONDS是秒,合起来就是1秒后执行一次
- scheduleAtFixedRate(一秒后开始执行,之后每隔period秒执行一次) 参数period:两次开始执行时间
- service.scheduleAtFixedRate(new Runnable() {
- @Override
- public void run() {
- //要做的事情M
- }
- },1,2, TimeUnit.SECONDS);
- scheduleWithFixedDelay(一秒后开始执行,之后每隔delay秒执行一次) 参数delay:前一次执行结束到下一次执行开始的间隔时间
- service.scheduleWithFixedDelay(new Runnable() {
- @Override
- public void run() {
- //要做的事情M
- }
- },1,2, TimeUnit.SECONDS);
三.定时执行次数(eg:每隔1秒执行一次共3次)
- private int count = 0;
- private Handler handler = new android.os.Handler();
- Runnable runnable = new Runnable() {
- @Override
- public void run() {
- //要做的事情 M
- …………………………………………
- //为什么是>=2,因为count为0时执行一次M,1时执行一次M,2时执行一次M,然后移除,不再执行(共执行3次M)
- if (count >= 2) {
- handler.removeCallbacks(this);//删除指定Runnable ,停止运行
- } else {
- handler.postDelayed(this, 1000);//一秒后执行
- count++;
- }
- }
- };
- handler.post(runnable);//启动定时器