现在我有一个像这样计时的 CountDownTimer:
MyTimer(60000, 1);
因此它以 1 毫秒的间隔递减 60 秒。 我在计时器中发出 bpm 信号。
这是通过将每分钟除以一个 bpm 数来完成的:
public void onTick(long millisLeft) {
if (TimeUnit.MILLISECONDS.toSeconds(millisLeft) % (60 / bpm) == 0) {
doSignal();
}
}
这很好用,但前提是定时器设置为间隔 1000
MyTimer(60000, 1000);
这意味着它会每秒滴答一次(每 1000 毫秒)。但我需要它以 1 毫秒为单位滴答作响。
我的情况的问题是,如果计时器以 1 毫秒的间隔计时。它会在应该的时候启动信号 - 但会快速重复。
如果间隔为 1000 毫秒且 bpm 设置为 20,则它会每三秒发出一次蜂鸣声 (60/20 == 3)。如果间隔设置为 1 毫秒,它将每三秒开始发出哔哔声 - 并在这一秒内重复发出哔哔声。
因此,不知何故,我的情况在比我预期的 1 毫秒自动收报机间隔更大的范围内是正确的。
我如何设计我的条件,使其每 (60/bpm) 秒仅触发一次,定时器的间隔为 1 毫秒?
最佳答案
TimeUnit.MILLISECONDS.toSeconds(millisLeft)
所有 57000 <= millisLeft <= 57999
返回 57所以在那一秒内你得到 1000 doSignal
调用(如 57 % (60/20) == 0
)。 54、51、...也是如此。为避免这种情况,您可以改用此表达式 millisLeft % (60000/20) == 0
.
关于java - 使用倒数计时器以特定时间间隔发出信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23876524/