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);

三.定时执行次数(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);//启动定时器
发布了63 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_40420578/article/details/103876900