Android倒计时CountDownTimer

来源:互联网 发布:地球大炮 知乎 编辑:程序博客网 时间:2024/05/19 20:48
现在的APP都有倒计时功能,例如:获取手机验证码倒计时60秒。实现这种倒计时的方式有很多种,如Handler。这里介绍的是Android自带的抽象类CountDownTimer。只要简简单单的几个步骤,就可以实现倒计时。通过查看其代码实现,也是使用Handler。

CountDownTimer timer= new CountDownTimer(30000, 1000) {
     public void onTick(long millisUntilFinished) {
         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
     }
     public void onFinish() {
         mTextField.setText("done!");
     }
  }
timer.start();

通过上述简简单单的几行代码就可以实现倒计时功能。构造函数第一个参数要倒计时的总毫秒数,这里是30秒,第二个参数是倒计时周期,这里这里设置的是1秒,也就是,onTick()方法会调用30次,然后完成倒计时调用onFinish完成相关业务操作。
onTick()方法和onFinish()方法是两个抽象方法,需要我们去实现,处理我们的相关业务逻辑。这里只是简简单单设置TextView 的内容。调用start()方法开始倒计时功能,CountDownTiemr的cancel()方法可以取消倒计时。
来,直接撸源代码:

/**
 * 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;
}
start()方法,逻辑简单清晰明了。保存到倒计时的时间,用Handler发送信息。那我们看看Hander的实现。


// 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 if (millisLeft < mCountdownInterval) {
                // no tick, just delay until done
               
sendMessageDelayed(obtainMessage(MSG), millisLeft);
            } else {
                long lastTickStart = SystemClock.elapsedRealtime();
                onTick(millisLeft);

                // take into account user's onTick taking time to execute
               
longdelay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();

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

                sendMessageDelayed(obtainMessage(MSG), delay);
            }
        }
    }
};
Handler的实现也是非常的简单,有点Android编程经验一看就懂~不解释哈

不懂Handler,可以看着这篇文章:Handler
原创粉丝点击