1. Timer + TimerTask实现定时器
1.1 代码实现
mTimer.schedule( mTimerTask, 2000, 3 * 1000 ); //表示2s后开始执行第一次,然后每隔3s执行一次
mTimer.schedule(mTimerTask,5000); //表示5s后执行一次
package com.mytest.util;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Handler;
/*
*
* 测试定时器的工具类
*
* */
public class TimerTaskTest {
private static final String TAG = TimerTaskTest.class.getSimpleName();
//----------------TimerTask实现定时器--------------------------------
private Timer mTimer = new Timer();
private TimerTask mTimerTask;
private int SECOND = 3;
private int num = 0;
public void testThreadTimerTask() {
Thread testThread = new Thread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "testThreadTimerTask new Thread: ");
testTimeerTask();
//testTimeerTaskOnce();
}
});
testThread.start();
}
/*
* delay 3000: 表示3s后在开始运行第一次,如果dms第一次8s,这里写为8就可以
* SECOND * 1000:这里是3s表示,没3s执行一次run()
* 如果要求只执行一次8s,mTimer.schedule( mTimerTask, 8000, 随意 * 1000 );,然后在run()调用mTimerTask.cancel()
* */
private void testTimeerTask() {
mTimerTask = new TimerTask( ) {
@Override
public void run() {
Log.d(TAG, "testTimeerTask num: " + num++);
if(num == 10) {
mTimer.cancel();
Log.d(TAG, "testTimeerTask cancel: " );
}
}
};
mTimer.schedule( mTimerTask, 3000, SECOND * 1000 );
}
/*
* //delay 为long类型:从现在起过delay毫秒执行一次 这里是5s
* */
public void testTimeerTaskOnce() {
mTimerTask = new TimerTask( ) {
@Override
public void run() {
Log.d(TAG, "testTimeerTask num: " + num++);
mTimer.cancel();
}
};
mTimer.schedule(mTimerTask,5000);
}
}
TimerTaskTest timer = new TimerTaskTest();
timer.testThreadTimerTask();
1.2 结果
结果证明
1.Timer是在子线程里面执行,timer是在一个单独的线程执行定时操作
11-30 07:59:26.102 9092 9117 D TimerTaskTest: testThreadTimerTask new Thread:
11-30 07:59:29.105 9092 9116 D TimerTaskTest: testTimeerTask num: 0
11-30 07:59:32.106 9092 9116 D TimerTaskTest: testTimeerTask num: 1
11-30 07:59:35.106 9092 9116 D TimerTaskTest: testTimeerTask num: 2
11-30 07:59:38.108 9092 9116 D TimerTaskTest: testTimeerTask num: 3
11-30 07:59:41.109 9092 9116 D TimerTaskTest: testTimeerTask num: 4
11-30 07:59:44.109 9092 9116 D TimerTaskTest: testTimeerTask num: 5
11-30 07:59:47.109 9092 9116 D TimerTaskTest: testTimeerTask num: 6
11-30 07:59:50.110 9092 9116 D TimerTaskTest: testTimeerTask num: 7
11-30 07:59:53.111 9092 9116 D TimerTaskTest: testTimeerTask num: 8
11-30 07:59:56.113 9092 9116 D TimerTaskTest: testTimeerTask num: 9
11-30 07:59:56.122 9092 9116 D TimerTaskTest: testTimeerTask cancel:
2. 子线程的handler实现定时器
2.1 代码实现
package com.mytest.util;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Handler;
/*
*
* 测试定时器的工具类
*
* */
public class TimerTaskTest {
private static final String TAG = TimerTaskTest.class.getSimpleName();
//----------------Handler 子线程 实现定时器--------------------------------
private Handler myHandler;
public void testTimerByHandler() {
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.d(TAG, "handleMessage");
}
};
Looper.loop();
}
}).start();
//测试时,新建线程和创建myHandler需要耗时,才能创建,因此加延时测试
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d(TAG, "sendMessageDelayed");
Message msg = new Message();
msg.what = 1;
if(myHandler != null) {
myHandler.sendMessageDelayed(msg, 4000);
}
}
}
2.2 结果
11-30 07:51:52.280 9019 9019 D TimerTaskTest: sendMessageDelayed
11-30 07:51:56.287 9019 9045 D TimerTaskTest: handleMessage
3. CountDownTimer实现倒计时
有时候我们需要倒计时和定时器,这时我们就需要简单易用的CountDownTimer和TimerTask了,下面说下这两位的
不同与相同之处。
CountDownTimer : 典型的倒计时,只需要继承CountDownTimer设置一个时间就可以处理自己的事件了,不需要
自己去关闭计时,倒计时完毕后会执行onFinish(),可以在onTick()和onFinish()中做UI处理。
TimerTask : 每隔一段时间执行一次事件,需要Timer和继承TimerTask,用起来也是很简单,还可以用做倒计时,
和CountDownTimer效果一样,可以调用timerTask.cancel()方法,关闭该计时器,不可以在其中做UI处理。
相同之处 : 都可用做倒计时,简单易用。
不同之处:UI处理地方不一样,关闭方式不一样。
- 也就是说CountDownTimer是在调用线程执行的,而Timertask是新建线程
CountDownTimer timer;
new CountDownTimer(60 * 1000, 1000) {
@Override
public void onFinish() {
}
@Override
public void onTick(long millisUntilFinished) {
}
}.start();
if(timer != null) {
timer.cancel();
}
https://blog.csdn.net/qq_26446715/article/details/80108991
https://blog.csdn.net/weixin_42564441/article/details/80967482