直接上代码:
eg: 关键点都在注释里
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.CountDownTimer;
import android.widget.TextView;
import java.lang.ref.WeakReference;
/**
* 倒计时工具类
* @author yi lu
*/
public class CountDownTimerUtils extends CountDownTimer {
WeakReference mTextView; //显示倒计时的文字 用弱引用 防止内存泄漏
private int mTickType; // 倒计时中的文字显示
private String mFinishTxt; // 倒计时结束后的文字显示
public CountDownTimerUtils(TextView textView, long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
this.mTextView = new WeakReference(textView);
}
/**
* 设置文字解析内容(自定义)
*/
public void setTickType(int tickType) {
this.mTickType = tickType;
}
/**
* 设置倒计时结束时的文字
*/
public void setFinishTxt(String finishTxt) {
this.mFinishTxt = finishTxt;
}
@SuppressLint("SetTextI18n")
@Override
public void onTick(long millisUntilFinished) {
if (mTextView.get() == null) //用弱引用 先判空 避免崩溃
{
cancle();
return;
}
mTextView.get().setClickable(false); //设置不可点击
mTextView.get().setText(formatTick(millisUntilFinished)); //设置倒计时时间
mTextView.get().setText(mTextView.get().getText().toString());
}
@Override
public void onFinish() {
if (mTextView.get() == null) //同上 先判空 避免崩溃
{
cancle();
return;
}
mTextView.get().setText(mFinishTxt);//设置结束文字
mTextView.get().setClickable(true);//设置可点击
}
/**
* 退出当前工具类
*/
private void cancle()
{
this.cancel();
}
/**
* 自定义解析模板(根据场景自己编写)
*/
private String formatTick(long millis)
{
switch (mTickType)
{
case 0:
return "重新发送(" + millis / 1000 + "S)";
case 1:
return formatTime(millis);
}
return "";
}
/**
* 将毫秒转化为 分钟:秒 的格式
*
* @param millisecond 毫秒
* @return 格式化后的时间
*/
private String formatTime(long millisecond)
{
int minute;//分钟
int second;//秒数
minute = (int) ((millisecond / 1000) / 60);
second = (int) ((millisecond / 1000) % 60);
if (minute < 10)
{
if (second < 10)
{
return "0" + minute + "分" + "0" + second + "秒";
} else
{
return "0" + minute + "分" + second + "秒";
}
} else
{
if (second < 10)
{
return minute + "分" + "0" + second + "秒";
} else
{
return minute + "分" + second + "秒";
}
}
}
}
调用
private CountDownTimerUtils mCountDownTimerUtils = null;
mCountDownTimerUtils = new CountDownTimerUtils(
tvDown, 3600000, 1000); //倒计时1小时
mCountDownTimerUtils.setTickType(1);
mCountDownTimerUtils.setFinishTxt("交易关闭……");
mCountDownTimerUtils.start();
销毁
@Override
protected void onDestroy() {
if (mCountDownTimerUtils == null) return;
mCountDownTimerUtils.cancel();
mCountDownTimerUtils = null;
super.onDestroy();
}