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

来源:互联网 发布:土方工程量计算软件 编辑:程序博客网 时间:2024/05/22 12:03

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 };  @Overrideprotected void onStart() {super.onStart();timer = new Timer();task = new TimerTask() {@Overridepublic void run() {--count;if (count <= 0) {cancel();dismiss();} else {mContext.runOnUiThread(new Runnable() {@Overridepublic void run() {tv_timer.setBackgroundResource(counter[count - 1]);}});}}}; timer.schedule(task, 1000, 1000);} @Overridepublic 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() { @Overridepublic void run() {if (pointer > 0) {runOnUiThread(runnable1);--pointer;} else {executor.shutdown();countDowning = false;runOnUiThread(runnable2);pointer = 120;}}}; private ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); @Overridepublic 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; }};};  @Overridepublic 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很方便。

0 0
原创粉丝点击