Dart【02】Timer定时器

359 阅读2分钟

Timer简介

Timer类主要用于安排延时任务和定时任务,

延时任务是指延迟一段时间之后才执行的任务,

定时任务是指每隔一段时间执行一次的任务。

Timer中的代码都是异步执行的。阅读源码可知Future类的Future构造函数和delayed构造函数都是使用的Timer类。

如何创建Timer

Timer默认构造函数

Timer默认的构造函数有两个必选参数

  1. 参数Duration:Duration类型,时间间隔。
  2. 参数Callback:函数类型,该函数在延迟Duration时间后执行。

示例:

  Timer(Duration(seconds: 1),(){
    print("方法被执行了");
  });
  print("同步代码");

输出结果

同步代码 方法被执行了

一秒之后控制台打印“方法被执行了”。

Timer.periodic构造函数

Timer.periodic构造函数有两个必选参数

  1. 参数Duration:Duration类型,时间间隔。
  2. 参数Callback:函数类型,该函数在每隔Duration时间后执行一次,此函数有一个timer参数,timer参数就是Timer.periodic构造函数创建的Timer对象。

示例:

  Timer.periodic(Duration(seconds: 2), (timer) {
    print(timer.runtimeType);
  });

输出结果

_Timer _Timer _Timer

每隔两秒控制台打印一次timer的类型

Timer的常用方法和属性

创建Timer对象

想测试Timer类的方法和属性,第一步肯定是创建Timer对象

示例:

Timer timer = Timer.periodic(Duration(seconds: 2), (timer) {
  });

isActive

判断当前定时器是否在活跃状态的bool值,

如果尚未执行回调并且未取消计时器,则计时器将处于活动状态。

如果尚未取消,则计时器处于活动状态。

timer.isActive

tick

tick代表((当前时间)-(timer启动的时刻))/(timerDuration参数),不是已经发生的回调调用次数。

该值从零开始,并在每次发生计时器事件时递增,因此每个回调将看到比前一个更大的值。

可能有一些难以理解,我们来看一段代码

  Timer timer = Timer.periodic(Duration(seconds: 2), (timer) {
    print("timer run");
  });
  print("timer.tick:${timer.tick}");
  Timer(Duration(seconds: 5), () {
    print("timer.tick:${timer.tick}");
  });

控制台输出如下

timer.tick:0 timer run timer run timer.tick:2

在程序刚开始执行的0秒打印,因为没有度过任何一个时间间隔(2s),所以tick等于0,到了第5秒,度过了两个时间间隔(2s),所以tick等于2。

cancel()

cancel方法用于取消Timer,一旦Timer已经被取消,回调函数不会被调用。

示例:

  Timer timer = Timer.periodic(Duration(seconds: 2), (timer) {
    print("timer run");
  });
  Timer(Duration(seconds: 5), () {
    print("timer.cancel");
    timer.cancel();
  });

输出结果:

timer run timer run timer.cancel

五秒之后定时器取消,回调函数停止调用,timer run不会再被打印。

run()

Timer.run()是静态方法,立即异步执行回调函数,等价于Timer(Duration.zero, callback)

run函数的参数类型为Function,需要异步执行的函数。

示例:

  Timer.run(() {
    print("timer.run");
  });