概述
在平时我们编程的时候,经常会用到倒计时这个功能,很多人不知道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();
看完源码终于知道了它的工作原理,原来也不是很难。