Android实现调度任务的三种方式:
1,Timer和TimerTask;
2,调度线程池:ScheduledExecutorService;
3,Handler消息机制;
一,Timer和TimerTask的使用:
//在一个Dialog中实现倒计时;
private Activity mContext;
private Timer timer;
private TimerTask task;
private int count = counter.length;
private static int[] counter = { R.drawable.counter_1, R.drawable.counter_2, R.drawable.counter_3 };
@Override
protected void onStart() {
super.onStart();
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
--count;
if (count <= 0) {
cancel();
dismiss();
} else {
mContext.runOnUiThread(new Runnable() {
@Override
public void run() {
tv_timer.setBackgroundResource(counter[count - 1]);
}
});
}
}
};
timer.schedule(task, 1000, 1000);
}
@Override
public void dismiss() {
super.dismiss();
if(timer!=null){
timer.cancel();
timer=null;
}
if(task!=null){
task.cancel();
task=null;
}
}
二.ScheduledExecutorService的使用:
//点击按钮执行一个倒计时;
/**
* 是否正在倒计时;
*/
private boolean countDowning;
private int pointer = 120;
private Runnable runnable1 = new Runnable() {
public void run() {
sendRemind.setText("发送提醒(" + pointer + "s)");
}
};
private Runnable runnable2 = new Runnable() {
public void run() {
sendRemind.setText(getText(R.string.send_remind));
}
};
private Runnable task = new Runnable() {
@Override
public void run() {
if (pointer > 0) {
runOnUiThread(runnable1);
--pointer;
} else {
executor.shutdown();
countDowning = false;
runOnUiThread(runnable2);
pointer = 120;
}
}
};
private ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.sendRemind:
if (!countDowning) {
countDowning = true;
executor.scheduleAtFixedRate(task, 0, 1000, TimeUnit.MILLISECONDS);
}
break;
}
}
三,Handler的使用:
/点击按钮执行一个倒计时;
/**
* 是否正在倒计时;
*/
private boolean countDowning;
private int pointer = 120;
private static final int COUNT_DOWN = 2222;
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case COUNT_DOWN:
if (pointer > 0) {
sendRemind.setText("发送提醒(" + pointer + "s)");
--pointer;
mHandler.sendEmptyMessageDelayed(COUNT_DOWN, 1000L);
} else {
mHandler.removeCallbacksAndMessages(null);
countDowning = false;
sendRemind.setText(getText(R.string.send_remind));
pointer = 120;
}
break;
}
};
};
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.sendRemind:
if (!countDowning) {
countDowning = true;
// executor.scheduleAtFixedRate(task, 0, 1000,
// TimeUnit.MILLISECONDS);
mHandler.sendEmptyMessage(COUNT_DOWN);
}
break;
}
}
简单小结:
1,使用Timer和TimerTask有时候并不能立即暂停或者取消调度任务,它总是还会继续执行一次才真正停止;
2,TimerTask和ScheduledExecutorService是新开了线程,这样就额外耗费了性能,而且在子线程中执行调度任务的时候修改UI比较麻烦;
3,使用Handler直接借用了系统的消息机制功能,本身就有MessageQueue和Looper,不用白不用,而且本身就在UI线程中,修改UI很方便。