您的位置:首页 > 移动开发 > Android开发

Android 计时器使用

2015-07-11 17:47 561 查看
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通知。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息