现在我有一个CountDownTimer,如下所示:
MyTimer(60000, 1);
所以它以1秒的间隔向下滴答60秒。 我在计时器中发出bpm信号。
这是通过将每分钟除以bpm-number来完成的:
public void onTick(long millisLeft) {
if (TimeUnit.MILLISECONDS.toSeconds(millisLeft) % (60 / bpm) == 0) {
doSignal();
}
}
这很有效,但只有在计时器设置为间隔1000
时才有效MyTimer(60000, 1000);
这意味着它将每秒钟(每1000毫秒)发一次。但我需要它以1ms的速度打勾。
我的情况的问题是如果计时器以1ms的间隔打勾。当它应该 - 但会快速重复时,它将启动信号。
如果间隔为1000毫秒且bpm设置为20,则每隔三秒发出一声哔声(60/20 == 3)。如果间隔设置为1ms,它将每隔三秒钟开始发出蜂鸣声 - 并在该秒钟内反复发出蜂鸣声。
所以某种程度上我的条件在一个更大的范围内是真实的,而不是我预期的1ms自动收报机间隔。
我如何设计我的条件,以便每隔(60 / bpm)秒启动一次定时器,间隔为1ms?
答案 0 :(得分:1)
TimeUnit.MILLISECONDS.toSeconds(millisLeft)
为所有57000 <= millisLeft <= 57999
返回57,因此在该秒内您会收到1000 doSignal
次来电(57 % (60/20) == 0
)。 54,51,...同样如此。为避免这种情况,您可以使用此表达式millisLeft % (60000/20) == 0
。