CountDownTimer

CountDownTimer源码解析

在平时开发过程中我们可能需要一个倒计时来实现某个功能,这时候我们可以使用CountDownTimer来实现该功能
作用
  • 可用于倒计时操作,内部采用Handler来实现的
那我们来看一看它内部到底是如何实现?
  • 首先我们使用构造函数创建CountDownTimer对象,需要传递两个参数,并实现两个抽象方法

    • 构造函数

        public CountDownTimer(long millisInFuture, long countDownInterval) {
              mMillisInFuture = millisInFuture;
              mCountdownInterval = countDownInterval;
        }
      
      • millisInFuture: 设置倒计时的总时间(毫秒)
      • countDownInterval: 设置每次减去的时间(毫秒)
    • 创建对象

        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()来触发倒计时,那我们来看看里面是如何实现的

        /**
         * 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发送消息

       // 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()来取消倒计时

        /**
         * Cancel the countdown.
         */
        public synchronized final void cancel() {
            mCancelled = true;
            mHandler.removeMessages(MSG);
        }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值