http://blog.csdn.net/lilu_leo/article/details/6941724
/**
* 验证码请求倒计时工具类
*
* @version v1.0
* @copyright 2010-2015
*/
@SuppressLint("ResourceAsColor")
public class TimeUtil {
// 倒计时timer
private CountDownTimer countDownTimer;
// 计时结束的回调接口
private OnFinishListener listener;
private TextView tv;
private Context mContext;
/**
* @param tvSend 需要显示倒计时的TextView
* @param max 需要进行倒计时的最大值,单位是秒
* @param interval 倒计时的间隔,单位是秒
*/
public TimeUtil(final Context context, final TextView tvSend, int max, int interval) {
this.mContext = context;
this.tv = tvSend;
// 由于CountDownTimer并不是准确计时,在onTick方法调用的时候,time会有1-10ms左右的误差,这会导致最后一秒不会调用onTick()
// 因此,设置间隔的时候,默认减去了10ms,从而减去误差。
// 经过以上的微调,最后一秒的显示时间会由于10ms延迟的积累,导致显示时间比1s长max*10ms的时间,其他时间的显示正常,总时间正常
countDownTimer = new CountDownTimer(max * 1000, interval * 1000 - 10) {
@Override
public void onTick(long time) {
tv.setTextColor(context.getResources().getColor(R.color.black));
tv.setBackgroundColor(context.getResources().getColor(R.color.white));
// 第一次调用会有1-10ms的误差,因此需要+15ms,防止第一个数不显示,第二个数显示2s
tv.setText(((time + 15) / 1000) + "秒后可重发");
}
@Override
public void onFinish() {
tv.setClickable(true);
// tv.setTextColor(Color.parseColor("#028ce3"));
// tv.setText(R.string.repeat_send);
if (listener != null) {
listener.finish();
}
}
};
}
/**
* 开始倒计时
*/
public void start() {
tv.setClickable(false);
countDownTimer.start();
}
/**
* 设置倒计时结束的监听器
*
* @param listener
*/
public void setOnFinishListener(OnFinishListener listener) {
this.listener = listener;
}
/**
* 计时结束的回调接口
*/
public interface OnFinishListener {
public void finish();
}
public void cancel() {
countDownTimer.cancel();
tv.setClickable(true);
// tv.setTextColor(Color.parseColor("#028ce3"));
tv.setText(mContext.getResources().getString(R.string.repeat_send));
}
}
handler使用倒计时
/*=====*/
Handler msmTimeOpHandler = new Handler();
Runnable msmTimeOpRunnable = new Runnable() {
@Override
public void run() {
msmTimeOp();
}
};
private void msmTimeOp() {
smsVailTime--;
if (smsVailTime == 1) {
vTimeTv.setText("正在跳转");
boolean isfirstStart = mSP.get().getBoolean(Config.SP_ISFIRSTSTART, false);
if (isfirstStart) {
PrefManager.getInstance().setLong(ExtraConstrat.OP_TIME, 0);
startActivity(MainActivity.class);
} else {
startActivity(GuidActivity.class);
}
mActivity.finish();
} else {
vTimeTv.setText(smsVailTime + "秒跳转");
msmTimeOpHandler.postDelayed(msmTimeOpRunnable, 1000);
}
}
发送按钮监听执行
msmTimeOpHandler.postDelayed(msmTimeOpRunnable, 1000);