前言
安卓的计时有很多种实现方式,今天自己封装一个,方便以后使用
今天这个是基于CountDownTimer进行的一个封装
代码也不复杂,直接贴上
代码和使用
public class CusCountDownUtil {
/**
* 倒计时结束的回调接口
*/
public interface FinishDelegate {
void onFinish();
}
/**
* 定期回调的接口
*/
public interface TickDelegate {
void onTick(long pMillisUntilFinished);
}
private final static long ONE_SECOND = 1000;
/**
* 总倒计时时间
*/
private long mMillisInFuture = 0;
/**
* 定期回调的时间 必须大于0 否则会出现ANR
*/
private long mCountDownInterval;
/**
* 倒计时结束的回调
*/
private FinishDelegate mFinishDelegate;
/**
* 定期回调
*/
private TickDelegate mTickDelegate;
private MyCountDownTimer mCountDownTimer;
/**
* 获取 CountDownTimerUtils
* @return CountDownTimerUtils
*/
public static CusCountDownUtil getCountDownTimer() {
return new CusCountDownUtil();
}
/**
* 设置定期回调的时间 调用{@link #setTickDelegate(TickDelegate)}
* @param pCountDownInterval 定期回调的时间 必须大于0
* @return CountDownTimerUtils
*/
public CusCountDownUtil setCountDownInterval(long pCountDownInterval) {
this.mCountDownInterval=pCountDownInterval;
return this;
}
/**
* 设置倒计时结束的回调
* @param pFinishDelegate 倒计时结束的回调接口
* @return CountDownTimerUtils
*/
public CusCountDownUtil setFinishDelegate(FinishDelegate pFinishDelegate) {
this.mFinishDelegate=pFinishDelegate;
return this;
}
/**
* 设置总倒计时时间
* @param pMillisInFuture 总倒计时时间
* @return CountDownTimerUtils
*/
public CusCountDownUtil setMillisInFuture(long pMillisInFuture) {
this.mMillisInFuture=pMillisInFuture;
return this;
}
/**
* 设置定期回调
* @param pTickDelegate 定期回调接口
* @return CountDownTimerUtils
*/
public CusCountDownUtil setTickDelegate(TickDelegate pTickDelegate) {
this.mTickDelegate=pTickDelegate;
return this;
}
public void create() {
if (mCountDownTimer != null) {
mCountDownTimer.cancel();
mCountDownTimer = null;
}
if (mCountDownInterval <= 0) {
mCountDownInterval = mMillisInFuture + ONE_SECOND;
}
mCountDownTimer = new MyCountDownTimer(mMillisInFuture, mCountDownInterval);
mCountDownTimer.setTickDelegate(mTickDelegate);
mCountDownTimer.setFinishDelegate(mFinishDelegate);
}
/**
* 开始倒计时
*/
public void start() {
if (mCountDownTimer == null) {
create();
}
mCountDownTimer.start();
}
/**
* 取消倒计时
*/
public void cancel() {
if (mCountDownTimer != null) {
mCountDownTimer.cancel();
}
}
private static class MyCountDownTimer extends CountDownTimer {
private FinishDelegate mFinishDelegate;
private TickDelegate mTickDelegate;
public MyCountDownTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long millisUntilFinished) {
if (mTickDelegate != null) {
mTickDelegate.onTick(millisUntilFinished);
}
}
@Override
public void onFinish() {
if (mFinishDelegate != null) {
mFinishDelegate.onFinish();
}
}
void setFinishDelegate(FinishDelegate pFinishDelegate) {
this.mFinishDelegate=pFinishDelegate;
}
void setTickDelegate(TickDelegate pTickDelegate) {
this.mTickDelegate=pTickDelegate;
}
}
}
大部分的方法作用都写在源码里面了
使用起来也很简单:
CusCountDownUtil countDownTimer = CusCountDownUtil.getCountDownTimer();
countDownTimer.setMillisInFuture(endTimes) // 倒计时总时间
.setCountDownInterval(1000) // 间隔监听onTick
.setTickDelegate(new CusCountDownUtil.TickDelegate() {
@Override
public void onTick(long pMillisUntilFinished) {
if (protectTimes == 0) {
canRobHeadlines();
} else if (protectTimes > 0) {
//未过保护期,显示倒计时
mDataBinding.tvRobTime.setText(protectTimes + "s");
mDataBinding.tvRobTime.setBackgroundResource(0);
mDataBinding.tvRobTime.setOnClickListener(null);
}
protectTimes--;
}
}).setFinishDelegate(new CusCountDownUtil.FinishDelegate() {
@Override
public void onFinish() {
doDestroy();
}
});
countDownTimer.start();
记得最后要回收资源:
if (countDownTimer!=null){
countDownTimer.cancel();
}
资料分享
最后分享一下其他的倒计时实现方式:
Android实现倒计时的几种方案汇总