做APP时有这种功能:点击发送按钮后手机会接收到验证码,但是有的时候由于短信网关故障等原因可能不能及时收到短息,所以设置一种倒计时机制,当倒计时时间结束后如果还没有收到验证码短信则可以选择重新发送验证码。
一、使用CountDownTimer这个抽象类
CountDownTimer这个抽象类,实现了倒计时的功能。将后台线程的创建和Handler队列封装成一个方便的类调用。这个类比较简单,只有四个方法:onTick,onFinsh、cancel和start。其中前面两个是抽象方法,所以要重写一下。
import android.os.CountDownTimer;
import android.widget.Button;
import com.neusoft.geexek.timer.R;
/**
* 点击发送按钮后手机会接收到验证码,倒计时60s
* @ClassName: TimeCount
* @date 2017年1月10日
*/
public class TimeCount extends CountDownTimer {
private Button btn_count;
public TimeCount(long millisInFuture, long countDownInterval,Button btn_count) {
super(millisInFuture, countDownInterval);
this.btn_count = btn_count;
}
@Override
public void onTick(long millisUntilFinished) {
btn_count.setEnabled(false);
btn_count.setText(millisUntilFinished / 1000 + "秒");
}
@Override
public void onFinish() {
btn_count.setEnabled(true);
btn_count.setText(R.string.get_verification_code);
}
}
timeCount = new TimeCount(60000, 1000,btn);
timeCount.start();
倒计时还没有结束的时候我已经不需要倒计时功能了,所以需要取消倒计时功能。CountDownTimer已经帮我们准备好了,只需要调用
timeCount.cancel();timeCount.onFinish();
cancle()用来取消倒计时,onFinish() 用来显示倒计时完成后需要做的事。如果不调用 cancle()用来取消倒计时,程序则会在倒计时完成后自动调用timeFirst.onFinish() 用来显示倒计时完成后需要做的事。
二、使用Timer
import java.util.Timer;
import java.util.TimerTask;
import android.os.Handler;
import android.os.Message;
import android.widget.Button;
public class TimeUtils {
private int time = 60;
private Timer timer;
private Button btnSure;
private String btnText;
public TimeUtils(Button btnSure, String btnText) {
super();
this.btnSure = btnSure;
this.btnText = btnText;
}
public void RunTimer() {
timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
time--;
Message msg = handler.obtainMessage();
msg.what = 1;
handler.sendMessage(msg);
}
};
timer.schedule(task, 100, 1000);
}
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
if (time > 0) {
btnSure.setEnabled(false);
btnSure.setText(time + "秒后重新发送");
btnSure.setTextSize(14);
} else {
timer.cancel();
btnSure.setText(btnText);
btnSure.setEnabled(true);
btnSure.setTextSize(14);
}
break;
default:
break;
}
};
};
}