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

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