CountDownTimer源码解析

概述

在平时我们编程的时候,经常会用到倒计时这个功能,很多人不知道Android已经帮封装好了一个类,往往都自己写。现在发现了这个类,大家共享一下

CountDownTimer 使用

CountDownTimer countDownTimer=new CountDownTimer(10*1000+1000, 1000) {
    @Override
    public void onTick(long millisUntilFinished) {
        int time= (int) (millisUntilFinished/1000);
        tv.setText(String.valueOf(time));
    }

    @Override
    public void onFinish() {
        tv.setText("倒计时完毕");
    }
};
countDownTimer.start();//调用该方法即可开始倒计时。

说明一下:CountDownTimer countDownTimer=new CountDownTimer(10*1000+1000, 1000)中,第一个参数表示总时间,第二个参数表示间隔时间。意思就是每隔一秒会回调一次方法onTick,然后10秒之后会回调onFinish方法。

CountDownTimer源码解析

首先我们先从它的构造方法开始查看源码,它构造方法如下所示:

public CountDownTimer(long millisInFuture, long countDownInterval) {
    mMillisInFuture = millisInFuture;
    mCountdownInterval = countDownInterval;
}

第一个参数表示倒计时的总时间,第二个参数表示倒计时的间隔时间,

紧接着我们查看CountDownTimers的start()方法如下所示:

/**
 * Start the countdown.
 */
public synchronized final CountDownTimer start() {
    mCancelled = false;
    if (mMillisInFuture <= 0) {//如果传入的总时间小于等于0则直接结束。
        onFinish();
        return this;
    }
    mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;//获取当前时间并加上传入的总时间,
    mHandler.sendMessage(mHandler.obtainMessage(MSG));
    return this;
}

如上我们可以知道CountDownTimers的start()方法会通过mHandler将消息发送出去,我们先看看接收消息地方的源码,如下所示:

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

从上面源码我们可以知道,当未到倒计时结束时间时会调用onTick()方法,否则会调用onFinish()方法,而这两个方法都是抽象方法,因此需要子类实现该方法,两个方法源码如下所示:

/**
 * Callback fired on regular interval.
 * @param millisUntilFinished The amount of time until finished.
 */
public abstract void onTick(long millisUntilFinished);

/**
 * Callback fired when the time is up.
 */
public abstract void onFinish();

 

看完源码终于知道了它的工作原理,原来也不是很难。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值