前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CountDownTimer

CountDownTimer

作者头像
全栈程序员站长
发布2022-10-02 13:24:02
4990
发布2022-10-02 13:24:02
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

CountDownTimer源码解析

在平时开发过程中我们可能需要一个倒计时来实现某个功能,这时候我们可以使用CountDownTimer来实现该功能
作用
  • 可用于倒计时操作,内部采用Handler来实现的
那我们来看一看它内部到底是如何实现?

首先我们使用构造函数创建CountDownTimer对象,需要传递两个参数,并实现两个抽象方法

构造函数

代码语言:javascript
复制
  public CountDownTimer(long millisInFuture, long countDownInterval) {
        mMillisInFuture = millisInFuture;
        mCountdownInterval = countDownInterval;
  }
  • millisInFuture: 设置倒计时的总时间(毫秒)
  • countDownInterval: 设置每次减去的时间(毫秒)

创建对象

代码语言:javascript
复制
  mCountDownTimer = new CountDownTimer(Long.MAX_VALUE, 5000) {
            @Override
            public void onTick(long l) {
      
            }

            @Override
            public void onFinish() {
          
            }
        };
  mCountDownTimer.start();

onTick(long l):用于返回还剩余多长时间,每间隔一段时间回调一次

onFinish():当倒计时结束时回调

CountDownTimer通过start()来触发倒计时,那我们来看看里面是如何实现的

代码语言:javascript
复制
    /**
     * Start the countdown.
     */
    public synchronized final CountDownTimer start() {
        mCancelled = false;
        if (mMillisInFuture <= 0) {
            onFinish();
            return this;
        }
        mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;
        mHandler.sendMessage(mHandler.obtainMessage(MSG));
        return this;
    }

首先会判断设置的倒计时时间是否小于等于0,是的话直接回调onFinish()方法;反之计算倒计时结束时的时间(当前时间+总的倒计时时间);然后通过handle发送消息

代码语言:javascript
复制
 // handles counting down
 private Handler mHandler = new Handler() {

 @Override
 public void handleMessage(Message msg) {

     synchronized (CountDownTimer.this) {
         if (mCancelled) {
             return;
         }

         final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();

         if (millisLeft <= 0) {
             onFinish();
         } else {
             long lastTickStart = SystemClock.elapsedRealtime();
             onTick(millisLeft);

             // take into account user's onTick taking time to execute
             long lastTickDuration = SystemClock.elapsedRealtime() - lastTickStart;
             long delay;

             if (millisLeft < mCountdownInterval) {
                 // just delay until done
                 delay = millisLeft - lastTickDuration;

                 // special case: user's onTick took more than interval to
                 // complete, trigger onFinish without delay
                 if (delay < 0) delay = 0;
             } else {
                 delay = mCountdownInterval - lastTickDuration;

                 // special case: user's onTick took more than interval to
                 // complete, skip to next interval
                 while (delay < 0) delay += mCountdownInterval;
             }

             sendMessageDelayed(obtainMessage(MSG), delay);
         }
     }
    }
   };

在Handle中我们首先会判断是否设置了mCancelled=true,若是的话直接不再处理,表示已经取消倒计时;反之,计算倒计时还剩余多少时间,若剩余时间<=0,则直接调用onFinish()表示倒计时结束;否则计算剩余时间时候大于设置每次减去的时间的时间,若是则发送延时消息,延时时间为mCountdownInterval,否则延时时间为剩余时间,这样就实现了倒计时的功能

CountDownTimer通过cancel()来取消倒计时

代码语言:javascript
复制
    /**
     * Cancel the countdown.
     */
    public synchronized final void cancel() {
        mCancelled = true;
        mHandler.removeMessages(MSG);
    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/192024.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月18日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CountDownTimer源码解析
    • 在平时开发过程中我们可能需要一个倒计时来实现某个功能,这时候我们可以使用CountDownTimer来实现该功能
      • 作用
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档