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

发布时间 2023-07-02 20:26:03作者: petercao

原文:https://blog.csdn.net/weixin_40420578/article/details/103876900

一.倒计时(3、2、1)

  • CountDownTimer()
  1.  
    //一共3秒,每隔1秒执行一次
  2.  
    CountDownTimer timer = new CountDownTimer(3000, 1000) {
  3.  
    @Override
  4.  
    public void onTick(long millisUntilFinished) {
  5.  
    //还剩下多少秒millisUntilFinished/1000,依次为2、1、0
  6.  
     
  7.  
    }
  8.  
     
  9.  
    @Override
  10.  
    public void onFinish() {//结束后的操作
  11.  
     
  12.  
    }
  13.  
    }.start();

二.定时器

1.Timer:完整定时任务需要由Timer、TimerTask两个类来配合完成。Timer是一种定时器工具,用来在一个后台线程计划执行指定任务,而TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。

计算下一次执行时间:当前时间(在任务执行前得到) + 时间片(实际时间)

缺陷:Timer对调度的支持是绝对时间,不会捕获异常,当TimerTask抛出异常导致Timer线程终止,Timer不会恢复,把整个线程取消。内部是单一线程

  • 公共的
  1.  
    //当前时间往后1分钟,eg:现在11:11:11,那么得到的是11:12:11(举例的是时分秒)
  2.  
    long currentTime = System.currentTimeMillis() + 1 * 60 * 1000;
  3.  
    Date date = new Date(currentTime);
  4.  
     
  5.  
    Timer timer=new Timer();
  6.  
     
  7.  
    timer.cancel();//取消定时器
  • 指定时间执行一次(当前时间1分钟后执行一次)
    1.  
      timer.schedule(new TimerTask() {
    2.  
      @Override
    3.  
      public void run() {
    4.  
      //要做的事情M
    5.  
      }
    6.  
      },date);
  • 延时执行一次(1秒后执行一次)

    1.  
      timer.schedule(new TimerTask() {
    2.  
      @Override
    3.  
      public void run() {
    4.  
      //要做的事情M
    5.  
      }
    6.  
      },1000);

     

  • 指定时间开始执行,执行完后等2秒再进行下一次,以此类推一直循环

    1.  
      timer.schedule(new TimerTask() {
    2.  
      @Override
    3.  
      public void run() {
    4.  
      //要做的事情M
    5.  
      }
    6.  
      },date,2000);
  • 延时1秒后开始执行,执行完后等2秒再进行下一次,以此类推一直循环

    1.  
      timer.schedule(new TimerTask() {
    2.  
      @Override
    3.  
      public void run() {
    4.  
      //要做的事情M
    5.  
      }
    6.  
      },1000,2000);

     

2.ScheduledExecutorService(推荐使用):是将定时任务与线程池功能结合在了一起,任务是并发执行,互不影响

计算下一次执行的时间:当前需要执行的时间(也就是计算出现在应该执行的时间)+ 时间片

优点:ScheduledExecutorService对调度的支持是相对时间(前一个执行结束后相隔多少秒再执行下一个),内部是个线程池

  • 公共的 
    1.  
      ScheduledExecutorService service= Executors.newScheduledThreadPool(10);//线程池数
    2.  
       
    3.  
      service.shutdown();//取消定时器

     

  • schedule延时执行一次
    1.  
      service.schedule(new Runnable() {
    2.  
      @Override
    3.  
      public void run() {
    4.  
      //要做的事情M
    5.  
      }
    6.  
      },1, TimeUnit.SECONDS);//TimeUnit.SECONDS是秒,合起来就是1秒后执行一次

     

  •  scheduleAtFixedRate(一秒后开始执行,之后每隔period秒执行一次)                                                                                      参数period:两次开始执行时间
    1.  
      service.scheduleAtFixedRate(new Runnable() {
    2.  
      @Override
    3.  
      public void run() {
    4.  
      //要做的事情M
    5.  
      }
    6.  
      },1,2, TimeUnit.SECONDS);

     

  • scheduleWithFixedDelay(一秒后开始执行,之后每隔delay秒执行一次)                                                                                 参数delay:前一次执行结束到下一次执行开始的间隔时间
    1.  
      service.scheduleWithFixedDelay(new Runnable() {
    2.  
      @Override
    3.  
      public void run() {
    4.  
      //要做的事情M
    5.  
      }
    6.  
      },1,2, TimeUnit.SECONDS);

     

三.定时执行次数(eg:每隔1秒执行一次共3次)

  1.  
    private int count = 0;
  2.  
    private Handler handler = new android.os.Handler();
  3.  
    Runnable runnable = new Runnable() {
  4.  
    @Override
  5.  
    public void run() {
  6.  
    //要做的事情 M
  7.  
    …………………………………………
  8.  
    //为什么是>=2,因为count为0时执行一次M,1时执行一次M,2时执行一次M,然后移除,不再执行(共执行3次M)
  9.  
    if (count >= 2) {
  10.  
    handler.removeCallbacks(this);//删除指定Runnable ,停止运行
  11.  
    } else {
  12.  
    handler.postDelayed(this, 1000);//一秒后执行
  13.  
    count++;
  14.  
    }
  15.  
    }
  16.  
    };
  17.  
     
  18.  
    handler.post(runnable);//启动定时器