Android实现调度任务的三种方式:TimerTask、ScheduledExecutorService、Handler

Android实现调度任务的三种方式:

1TimerTimerTask

2,调度线程池:ScheduledExecutorService

3Handler消息机制;

 

一,TimerTimerTask的使用:

//在一个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,使用TimerTimerTask有时候并不能立即暂停或者取消调度任务,它总是还会继续执行一次才真正停止;

2TimerTaskScheduledExecutorService是新开了线程,这样就额外耗费了性能,而且在子线程中执行调度任务的时候修改UI比较麻烦;

3,使用Handler直接借用了系统的消息机制功能,本身就有MessageQueueLooper,不用白不用,而且本身就在UI线程中,修改UI很方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值