Android 定時器Timer 和handler

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章