我正在使用从服务器获取数据的周期性计时器。当bool (userExpectingTimerBool
)被设置为false时,我需要有条件地停止计时器,并由用户显式地停止它。停止后,周期定时器_timer
和最后调度回调定时器_t
(或t
)都不能运行
我现在有一个完全工作的代码。但我觉得有些是多余的在阅读文档后,我仍然不清楚周期性计时器的某些方面。代码如下:
我有四个问题:
- 我是否需要同时停止
_timer
和_t
(或t
)来停止所有计划任务? - 我应该使用哪个定时器来显示搜索计数(
t.tick
/_t.tick
/_timer.tick
)? - 回调函数是一个暂态(无名)方法。定时器作为参数传递给它(
t
)是一个持久的或短暂的对象(即,它的值将在运行中保留)? - 以下代码的哪些部分是冗余的/可以减少?
有条件运行的周期定时器:
Timer _timer;
Timer _t;
bool userExpectingTimerBool=false;
var timerSearchCount;
var tSearchCount;
_timer = Timer.periodic(
Duration(seconds: intervalGiven),
(Timer t) {
_t= t;
if (userExpectingTimerBool == false) t.cancel();
tSearchCount=t.tick;
_displayResult();
}
);
timerSearchCount=_timer?.tick;
用户控制停止定时器功能:
void stoptimer(){
setuserExpectingTimerBool(false);
if (_t !=null){_t!.cancel();}
if (_timer !=null){_timer!.cancel();}
checktimerActive();
}
-
当
Timer.periodic
调用它的回调时,它应该调用它自己作为回调的Timer
参数。因此,_t
只是_timer
的别名,两者都没有意义。(您可以通过打印identityHashCode(timer)
并与identityHashCode(_timer)
进行比较来验证这一点。) -
看到# 1。没关系。
-
看到# 1。
Timer.periodic
只创建了一个Timer
对象 if (userExpectingTimerBool == false)
如果
userExpectingTimerBool
不可为空,那么它将更清楚地显示为if (!userExpectingTimerBool)
。(如果你认为== false
更具可读性,那么为什么不选择if ((userExpectingTimerBool == false) == true)
和if (((userExpectingTimerBool == false) == true) == true)
等等)userExpectingTimerBool
似乎没有必要;如果stoptimer
被调用,Timer
将被取消并阻止额外的回调。因此,您不需要在回调中执行额外的取消检查。if (_timer !=null){_timer!.cancel();}
如前所述,
_timer
是非空的,因此空检查是不必要的。如果您想让_timer
为空,那么您可以用_timer?.cancel();
替换显式的if
检查。