Android:倒计时、定时器、定时执行次数使用笔记

一.倒计时(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);
------------------------------

private final ScheduledExecutorService schExecutor = Executors.newSingleThreadScheduledExecutor(); // 单线程

Runnable runnable1 = () -> mHandler.obtainMessage(Constants.MESSAGE_TIMEOUT).sendToTarget();
ScheduledFuture<?> sf = schExecutor.schedule(runnable1, 10, TimeUnit.SECONDS); // 设置10s定时任务,超时发送message

sf.cancel(true); // 取消定时

--------------------------------


三.定时执行次数(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);//启动定时器
posted @ 2023-07-02 20:17  petercao  阅读(387)  评论(0编辑  收藏  举报