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