使用倒数计时器以特定间隔发出信号
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();
以上是关于使用倒数计时器以特定间隔发出信号的主要内容,如果未能解决你的问题,请参考以下文章