项目中一般都会有验证码倒数计时器的功能,毫无疑问,利用CountDownTimer实现最简单实用。
import android.os.CountDownTimer;
/**
* 功能:公共倒计时类
*/
public class FCountDownTimer extends CountDownTimer {
private OnCountDownTimerListener countDownTimerListener;
public void setCountDownTimerListener(OnCountDownTimerListener countDownTimerListener) {
this.countDownTimerListener = countDownTimerListener;
}
/**
* @param secondsInFuture 倒计时的总时长:秒
* @param countDownInterval 倒计时的时间间隔:秒
*/
private FCountDownTimer(long secondsInFuture, long countDownInterval) {
super(secondsInFuture * 1000, countDownInterval * 1000);
}
public FCountDownTimer(long secondsInFuture) {
this(secondsInFuture, 1);
}
@Override
public void onTick(long millisUntilFinished) {
if (countDownTimerListener != null) {
countDownTimerListener.onTick(millisUntilFinished / 1000);
}
}
@Override
public void onFinish() {
if (countDownTimerListener != null) {
//手动调用onFinish时,只是更新UI,倒计时并没有结束,要结束倒计时,必须调用cancel方法
cancel();
countDownTimerListener.onFinish();
}
}
public interface OnCountDownTimerListener {
/**
* 更新倒计时时间
*
* @param secondsUntilFinished 秒
*/
void onTick(long secondsUntilFinished);
/**
* 完成倒计时:
* <p>
* 手动调用onFinish时,只是更新UI,倒计时并没有结束,要结束倒计时,必须调用cancel方法
*/
void onFinish();
}
}
为了不用在构造实体的时候传毫秒,更新UI的时候/1000,我在自己的构造函数中做了*1000的动作,且默认间隔设置成了1秒,接下来看使用代码:
private FCountDownTimer countDownTimer;
//总倒计时长120秒,默认间隔1秒
countDownTimer = new FCountDownTimer(120);
countDownTimer.setCountDownTimerListener(new FCountDownTimer.OnCountDownTimerListener() {
@Override
public void onTick(long secondsUntilFinished) {
//这里传回的也是秒
textView.set(secondsUntilFinished + "秒");
}
@Override
public void onFinish() {
textView.set("重新获取");
}
});
最后在使用的时候调用countDownTimer.start()开始倒计时,调用countDownTimer.onFinish()结束倒计时。
最后补充一句:标题之所以写“多功能倒数计数器”,就很显然了。