1. 概述
有时候在开发过程中,会有一些关于 延迟或者每隔多久做一次操作 这样的需求,常见需求如下:
1>:延迟2秒之后,然后做一些操作:
a:Thread.sleep(2000);
b:handler.postDelayed() ;
2>:每隔5秒,做一次操作,2分钟之后不管是否达到目的,就直接结束;
可以直接用 CountDownTimer 定时器,就是 验证码倒计时用的即可;
3>:0.5秒之后,每隔2秒循环执行run()操作,这种需求一般不常见,因为让每2秒都循环执行调用接口,这样循环执行操作非常耗费性能;
用 Timer 和 TimerTask即可;
4>:点击开始按钮,数字开始计时;点击停止就停止计时;
2. 具体实现方式如下:
1>:延迟2秒之后,然后做一些操作;
// 方法 1:
new Thread() {
@Override
public void run() {
super.run();
Thread.sleep(2000); //休眠2秒
// 要执行的操作
}
}.start();
// 方法 2:
new Handler().postDelayed(new Runnable(){
public void run() {
// 延迟2秒后需要做的事情
}
}, 2000);
2>:每隔5秒,做一次操作,2分钟之后不管是否达到目的,就直接结束;
private void countTimerTask() {
if (countDownTimer == null) {
// 每隔6000 毫秒执行onTick中的方法一次
// 直到执行完 60000/6000 次为止,最后会执行onFinish()中的方法
countDownTimer = new CountDownTimer(1000*60*3, 6000) {
@Override
public void onTick(long millisUntilFinished) {
/*String strText = "" + (int) (millisUntilFinished / 1000) + "s 后重发";
btn_code.setText(strText);*/
// 每隔 6秒 调用一次接口
doPayMoney();
}
@Override
public void onFinish() {
/*btn_code.setEnabled(true);
btn_code.setText("重新获取");*/
// bt_code.setBackgroundResource(R.drawable.text_login_order_bg);
// ToastUtils.showMyToast(CreateCodeActivity.this,ToastUtils.OPTION_FAIL,"支付失败");
}
};
}
countDownTimer.start();
}
// 执行完操作后,就取消定时器 并且将其置为null
if (countDownTimer != null) {
countDownTimer.cancel();
countDownTimer = null;
}
3>:0.5秒之后,每隔2秒循环执行run()操作;
timer.schedule(new TimerTask() {
@Override
public void run() {
// 0.5秒之后,每隔2秒 调用一次 接口
doPayMoney(paymentCodeThing);
}
}, 500, 2000);
/**
* 调用接口
*/
public void doPayMoney(String paymentCodeThing){
// 调用接口之后,需要更新UI,这个时候就需要 使用 handler更新UI
Message message=new Message();
message.what=0;
mHandler.sendMessage(message);
}
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what == 0){
//这里可以进行UI操作,如Toast,Dialog等
}
}
// 执行完之后就取消 Timer和TimerTask
if(timer != null){
timer.cancle();
timer = null ;
}
if(timerTask != null){
timerTask.cancle() ;
timerTask= null ;
}
4>:点击开始按钮,数字开始计时;点击停止就停止计时;
public class TestActivity extends Activity {
private TextView timer;//显示时间的控件
private int recLen = 60;//定时长度
private Button startRec, stopRec;//控制开始计时和停止计时的按钮
private static final int START = 0;//开始计时消息标志,下面用到
private static final int STOP = 1;//停止计时消息标志,下面用到
private static int RUN = 0;//子线程中的while循环判断标志
private Thread thread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
timer = (TextView) findViewById(R.id.timer);
startRec = (Button) findViewById(R.id.start);
stopRec = (Button) findViewById(R.id.stop);
startRec.setOnClickListener(listener);
stopRec.setOnClickListener(listener);
}
public View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.start:
RUN = 0;
thread = new Thread(new MyThread()); // start thread
thread.start();
break;
case R.id.stop:
// long tid = thread.getId();
RUN = 1111;
thread.interrupt();
thread.run();
Message message = new Message();
message.what = STOP;
handler.sendMessage(message);
break;
default:
break;
}
}
};
final Handler handler = new Handler() { // handle
public void handleMessage(Message msg) {
switch (msg.what) {
case START:
recLen--;
timer.setText("" + recLen);
break;
case STOP:
timer.setText("" + recLen);
break;
}
super.handleMessage(msg);
}
};
public class MyThread implements Runnable { // thread
@Override
public void run() {
while (0 == RUN) {
try {
Thread.sleep(1000); // sleep 1s
Message message = new Message();
message.what = START;
handler.sendMessage(message);
} catch (Exception e) {
}
}
}
}
}
具体代码已上传至github:
https://github.com/shuai999/TimerAndTimertask.git