Android实现定时器3种方式,现将三种方式写在一个类里,对比参考:
/**
* @author huihui 三种计时器
*/
public abstract class MyTimer {
private int count = 0; // 计时器执行次数
private int type = 1; // 1表示handle+Thread,2表示handle的postdelay,3表示TimeTask
private int duration = 0; // 计时器时间间隔
private boolean flg1 = false; // 计时器1标记
private Timer timer;
Handler myHandler;
public abstract void onTick();
public MyTimer() {
count = 0;
myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0x123:
count++;
onTick();
break;
default:
break;
}
}
};
}
public int getCount() {
return count;
}
public void start(int type, int duration) {
stop();
count = 0;
this.type = type;
this.duration = duration;
switch (type) {
case 1: // 启动计时器1
flg1 = true;
new Thread(new MyThread()).start();
break;
case 2:
myHandler.postDelayed(runnable, duration);
break;
case 3:
timer = new Timer();
/**
* 第三种计时器方式, timerTask
*/
TimerTask task = new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
myHandler.sendEmptyMessage(0x123);
}
};
timer.schedule(task, duration, duration);
break;
default:
break;
}
}
public void stop() { // 停止计时器
flg1 = false;
switch (type) {
case 2:
myHandler.removeCallbacks(runnable);
break;
case 3:
timer.cancel();
break;
default:
break;
}
}
/**
* 第二种计时器方式 handle postdelay
*/
private Runnable runnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
myHandler.postDelayed(this, duration);
count++;
onTick();
}
};
/**
* @author huihui 第一种计时器方式, handle+thread
*/
class MyThread implements Runnable {
@Override
public void run() {
while (flg1) {
try {
Thread.sleep(duration);
myHandler.sendEmptyMessage(0x123);
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
另还有系统倒计时CountDownTimer类,此类可实现倒计时功能,并在固定间隔收到通知。
CountDownTimer countDownTimer = new CountDownTimer() {
@Override
public void onTick(long millisUntilFinished) {
// TODO Auto-generated method stub
}
@Override
public void onFinish() {
// TODO Auto-generated method stub
}
};
其中OnTick的调用是同步的,即前一次调用处理完了才有可能处理下一次调用。如果处理时间超过OnTick间隔,会漏掉OnTick通知。