文章目录
  1. 1. Android 定时器
    1. 1.1. Handler与sleep(long)方法
      1. 1.1.0.1. 定义一个Handler类,用于处理接受到的Message。
      2. 1.1.0.2. 新建一个实现Runnable接口的线程类,如下:
      3. 1.1.0.3. 在需要启动线程的地方加入下面语句:
      4. 1.1.0.4. 启动线程后,线程每10s发送一次消息。
  2. 1.2. Handler的postDelayed(Runnable, long)方法
    1. 1.2.0.1. 定义一个Handler类
    2. 1.2.0.2. 启动计时器
    3. 1.2.0.3. 停止计时器
  • 1.3. Handler与timer及TimerTask结合的方法
    1. 1.3.0.1. 定义定时器、定时器任务及Handler句柄
    2. 1.3.0.2. 初始化计时器任务
    3. 1.3.0.3. 启动定时器
    4. 1.3.0.4. Timer的坑
      1. 1.3.0.4.1. 根本停不下来!
      2. 1.3.0.4.2. 只能执行一遍
  • Android 定时器

    Handler与sleep(long)方法

    Handler主要用来处理接受到的消息。这只是最主要的方法,当然Handler里还有其他的方法供实现,有兴趣的可以去查API,这里不过多解释。

    定义一个Handler类,用于处理接受到的Message。

    1
    2
    3
    4
    5
    6
    Handler handler = new Handler() {
    public void handleMessage(Message msg) {
    // 要做的事情
    super.handleMessage(msg);
    }
    };

    新建一个实现Runnable接口的线程类,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class MyThread implements Runnable {
    @Override
    public void run() {
    // TODO Auto-generated method stub
    while (true) {
    try {
    Thread.sleep(10000);// 线程暂停10秒,单位毫秒
    Message message = new Message();
    message.what = 1;
    handler.sendMessage(message);// 发送消息
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    }

    在需要启动线程的地方加入下面语句:

    1
    new Thread(new MyThread()).start();

    启动线程后,线程每10s发送一次消息。

    Handler的postDelayed(Runnable, long)方法

    定义一个Handler类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Handler handler=new Handler();
    Runnable runnable=new Runnable() {
    @Override
    public void run() {
    // TODO Auto-generated method stub
    //要做的事情
    handler.postDelayed(this, 2000);
    }
    };

    启动计时器

    1
    handler.postDelayed(runnable, 2000);//每两秒执行一次runnable.

    停止计时器

    1
    handler.removeCallbacks(runnable);

    Handler与timer及TimerTask结合的方法

    定义定时器、定时器任务及Handler句柄

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private final Timer timer = new Timer();
    private TimerTask task;
    Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
    // TODO Auto-generated method stub
    // 要做的事情
    super.handleMessage(msg);
    }
    };

    初始化计时器任务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    task = new TimerTask() {
    @Override
    public void run() {
    // TODO Auto-generated method stub
    Message message = new Message();
    message.what = 1;
    handler.sendMessage(message);
    }
    };

    就是说当定时器到达指定的时间时要做的工作,这里是想Handler发送一个消息,由Handler类进行处理。

    启动定时器

    1
    timer.schedule(task, 2000, 2000);

    java.util.Timer.schedule(TimerTask task, long delay):这个方法是说,dalay/1000秒后执行task.只执行一次。
    java.util.Timer.schedule(TimerTask task, long delay, long period):这个方法是说,delay/1000秒后执行task,然后进过period/1000秒再次执行task,这个用于循环任务,执行无数次,当然,你可以用

    1
    timer.cancel();

    取消计时器的执行。

    Timer的坑

    根本停不下来!

    这个Timer开发的时候启动了以后发现根本停不下来。
    根本停不下来!

    然后我发现尼玛timer.cancel()里的timer跟timer.schedule(task, 2000, 2000);不是一个!

    于是我出门吃个根棒棒糖,表示想一个人静静。

    回来后发现,timer声明的时候不是全局声明的。

    于是在timer.cancel的时候系统自动给乱七八糟的指了一个不知道在哪的指针。

    加到全局去声明,世界顿时和谐了。

    只能执行一遍

    你发现当你timer.cancel()后,如果再想执行这个timer.schedule就会报错了。
    那是因为timer.cancel后这个timer整个被释放掉了,也就是timer为空了。所以如果多次使用。需要每次在使用前检查是否为空。

    1
    2
    3
    4
    if (timer == null) {
    timer = new Timer();
    }
    timer.schedule(task, 0, ControlData.DELAY_TIME);

    搞定。

    文章目录
    1. 1. Android 定时器
      1. 1.1. Handler与sleep(long)方法
        1. 1.1.0.1. 定义一个Handler类,用于处理接受到的Message。
        2. 1.1.0.2. 新建一个实现Runnable接口的线程类,如下:
        3. 1.1.0.3. 在需要启动线程的地方加入下面语句:
        4. 1.1.0.4. 启动线程后,线程每10s发送一次消息。
    2. 1.2. Handler的postDelayed(Runnable, long)方法
      1. 1.2.0.1. 定义一个Handler类
      2. 1.2.0.2. 启动计时器
      3. 1.2.0.3. 停止计时器
  • 1.3. Handler与timer及TimerTask结合的方法
    1. 1.3.0.1. 定义定时器、定时器任务及Handler句柄
    2. 1.3.0.2. 初始化计时器任务
    3. 1.3.0.3. 启动定时器
    4. 1.3.0.4. Timer的坑
      1. 1.3.0.4.1. 根本停不下来!
      2. 1.3.0.4.2. 只能执行一遍