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

标签 java android algorithm timer countdowntimer

现在我有一个像这样计时的 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/

相关文章:

java - 预处理器后的 CDT IASTNode getRawSignature

java - 如何在基于抽象语法树的解释器中表示类

android - SlidingMenu 无法突出显示所选项目

android.widget.Switch 切换事件监听器?

python - 多值字典到单个字典的列表

python - 递归:为什么函数返回数字的阶乘而不是返回 1?

java - 如何让 Intellij 在 spring-boot webapp 准备好后自动启动浏览器

java - 运行方法在 BroadcastReceiver 中有效,但循环方法失败

android - 修复 android 和 iOS 原生 react 中的行数

java - eclipse RCP : Stopping a thread/job that freezes