现在的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 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
long delay = 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);
}
}
}
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
long delay = 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