使用倒数计时器以特定间隔发出信号

Posted

技术标签:

【中文标题】使用倒数计时器以特定间隔发出信号【英文标题】:Signal at a specific interval with a countdown timer 【发布时间】:2014-05-26 19:22:57 【问题描述】:

现在我有一个像这样滴答作响的 CountDownTimer:

MyTimer(60000, 1);

所以它以 1ms 的间隔计时 60 秒。 我在我的计时器中发出 bpm 信号。

这是通过将每分钟除以 bpm 数来完成的:

public void onTick(long millisLeft) 
    if (TimeUnit.MILLISECONDS.toSeconds(millisLeft) % (60 / bpm) == 0) 
     doSignal();
    

这很好用,但前提是计时器设置为间隔 1000

MyTimer(60000, 1000);

这意味着它将每秒(每 1000 毫秒)滴答一次。但我需要它在 1 毫秒时打勾。

我的情况的问题是,如果计时器以 1ms 的间隔计时。它会在应该的时候启动信号 - 但会快速重复。

如果间隔为 1000 毫秒且 bpm 设置为 20,它将每隔三秒发出一次哔声 (60/20 == 3)。如果间隔设置为 1 毫秒,它将每隔三秒开始发出哔哔声 - 并在那一秒内重复哔哔声。

所以不知何故,我的条件在比我预期的 1ms 代码间隔更大的范围内为真。

如何设计我的条件,使其每 (60 / bpm) 秒仅触发一次,计时器间隔为 1ms?

【问题讨论】:

【参考方案1】:

TimeUnit.MILLISECONDS.toSeconds(millisLeft) 为所有 57000 <= millisLeft <= 57999 返回 57,因此在那一秒内您会收到 1000 个 doSignal 调用(如 57 % (60/20) == 0)。 54, 51, ... 也是如此。为避免这种情况,您可以使用此表达式而不是 millisLeft % (60000/20) == 0

【讨论】:

谢谢。实际上,我确实从一开始就尝试过。但似乎 onTick 的行为真的很奇怪。不知何故,if 语句在大多数情况下都会丢失。就好像它没有及时完成一样。回到绘图板似乎。我需要 1ms 滴答的原因是因为我有一堆会弹出并运行的计时器。如果代码为 1000 毫秒,则计时器之间的转换会出现一个小问题(当下一个计时器被弹出时)。 不确定 android 计时器,但至少 this 声明您不会收到对 onTick 的重叠调用。如果您的 doSignal 花费的时间超过一毫秒,这可能会导致丢失滴答声。在这种情况下,这样的事情可能会有所帮助:Long signalledSecond = 0l; public void onTick(long millisLeft) Long second = TimeUnit.MILLISECONDS.toSeconds(millisLeft+999); if (second % (60 / 20) == 0 && signalledSecond != second) signalledSecond = second; doSignal();

以上是关于使用倒数计时器以特定间隔发出信号的主要内容,如果未能解决你的问题,请参考以下文章

在 Grub 2.02 源代码中查找倒数计时器

具有可配置开始时间的 JQuery 倒数计时器

使用 JavaScript 创建一个兔年春节倒数计时器

运送时间的每日倒数计时器

使用 JDA 在 Discord 消息中创建倒数计时器

颤振倒数计时器