【问题标题】:Round CountDown timer? (millispersecond accuracy)?倒数计时器? (毫秒精度)?
【发布时间】:2016-02-05 15:02:44
【问题描述】:

我在我的代码中使用 countDownTimer。问题是,倒数计时器不准确。 onTick 方法不会总是每秒执行一次,它可能会延迟几毫秒。当尝试基于millisUntilFinished 执行某个任务时,这会成为一个问题。当我的 20 秒计时器中的 10 秒过去时,我正在尝试记录:

以下是相关代码:

    if (millisUntilFinished == 10000) { //TEN SECONDS

                Log.v(TAG, "TEN SECONDS LEFT");
            }

问题出现在这里,因为 countDownTimer 甚至可能永远不会拥有 millisUntilFinished == 10000,它可能等于 1001,因此我的代码不会执行。无论如何以某种方式将millisUntilFinished(很长)四舍五入到最接近的数千?我尝试了以下方法:

 millisUntilFinishedRounded = MathUtils.round((double) millisUntilFinished, -3); // nearest thousand, 2000.0

但我无法解析“MathUtils”

我迷路了。我非常感谢任何反馈(正面或负面)!非常感谢您的所有帮助。

{Rich}

【问题讨论】:

  • ((500 + millisUntilFinished) / 1000) * 1000 将正值四舍五入到最接近的 1000。但您也可以使用 (millisUntilFinished >= 9500 && millisUntilFinished < 10500) 作为您的条件。
  • 或者如果你想一次性执行一些代码。只需检查millisUntilFinished
  • @AndyTurner 感谢您的宝贵时间,我们为什么要添加 500 个?
  • 如果要四舍五入到最接近的 1000,则需要添加 500,而不是四舍五入到最接近的 1000。例如对于 750:(750 + 500) / 1000 * 1000 = 1000,而 750 / 1000 * 1000 = 0
  • @AndyTurner 您的回答有效!我有点困惑为什么......不是900/1000 = 0.9吗? 0.9 x 1000 = 9000,而不是 10000;为什么这仍然有效?它是从 0.9 -> 1 向上取整吗?如果是这样,如果商高于 1 但低于 2,它会如何工作,它还会再次四舍五入到 2 吗?非常感谢您的回答,一旦这些问题得到回答,我会将其标记为最佳答案并喜欢您的帖子! :)

标签: java android math timer clock


【解决方案1】:

有几种选择:

  1. 您可以通过添加 N/2、除以 N 并再次乘以 N 将正整数四舍五入到最接近的 N:

    ((500 + millisUntilFinished) / 1000) * 1000

  2. 您可以使用一个条件来检查该值是否在四舍五入到 10000 的范围内:

    millisUntilFinished >= 9500 && millisUntilFinished

  3. 您可以检查millisUntilFinished 首次低于 10000:

    boolean printedMessage = false;
    while (true) {
      millisUntilFinished = ...
      if (!printedMessage && millisUntilFinished < 10000) {
        System.out.println("Your message");
        printedMessage = true;
      }
    }
    

【讨论】:

  • 哦,我明白了!非常感谢。我喜欢并标记了最佳答案!
  • 我猜java总是四舍五入,所以为了防止两次得到10,加500。非常聪明!
  • Java 四舍五入 趋向于零,即它对负数进行四舍五入。这就是为什么我规定该方法适用于正整数。 (实际上,非负数会更精确)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多