【问题标题】:Handler not running 1000 times in 1 second处理程序未在 1 秒内运行 1000 次
【发布时间】:2018-07-17 14:12:36
【问题描述】:

我有一个任务,我想每毫秒更新一次(某种计算)。现在这是我正在做的,延迟 1 毫秒。-

 int countertest =0;

 myRunnable = new Runnable() {
                    @Override
                    public void run() {
                        countertest++;
                        System.out.println("----counter----->"+countertest);
                        myHandler.postDelayed(myRunnable, 1); //runs every 1 millisecond
                    }
                };

我在单击按钮时启动myHandler,并在 1 秒后停止它 (removeCallbacksAndMessages(null))。现在myHandler 应该在一秒钟内运行 1000 次。但它有时会运行 110 次,有时会运行 119 次……一些随机数。不知道为什么它不能在 1 秒内准确运行 1000 次。谁能详细说明一下。

我现在应该怎么做才能在 1 秒内执行 1000 次?举例来说,如果我想在一秒钟内显示从 0000 到 1000 的文本,或者在 1 秒内准确地打印 0-1000,不超过 1 秒也不少于 1 秒。 反对者请。在下面发表评论,以便我知道我错在哪里。谢谢。

用于上述测试的设备 - 三星 S9。

【问题讨论】:

  • 如果您确实需要经常执行某些操作,最好使用循环并使用System.nanotime 检查是否经过了足够的时间 - 这仍然可能不是精确的 1000,因为这仍然取决于系统,但在大多数情况下它应该运行良好。此外,您的代码不是每 1 毫秒执行一次,而是执行它需要 1 毫秒 + 时间。
  • 我不认为递增整数需要 100s 毫秒 @GotoFinal
  • 10ms* Ofc 它没有,但只是说它并不精确,并且递增整数只是 3 个操作之一 - 创建新任务以延迟可能需要一点时间 - 但也可能更少超过 1 毫秒。所以只有大约 900 的结果也是可能的。
  • 是的,但 myHandler 使 runnable 只运行大约 100-120 次。我正在使用Samsung S9,它有很好的内存。
  • 你已经回答了为什么,如果你真的需要这样的东西,我只是给了你另一个想法——创建一个循环。但真正的问题似乎是:为什么您需要经常在手机上执行某些操作?

标签: java android handler runnable android-handler


【解决方案1】:

here 所述,“您的”系统根本无法保证毫秒精度:

以毫秒为单位返回当前时间。请注意,虽然单位 返回值的时间为毫秒,粒度为 value 取决于底层操作系统,可能更大。 例如,许多操作系统以几十为单位测量时间 毫秒。

【讨论】:

  • 那么在 1 秒内准确执行 1000 次的正确方法是什么?
  • @karanatwal.github.io,对于在典型的桌面、服务器或移动设备操作系统上运行的程序来说,这可能很难做到,甚至是不可能的。如果您需要精确计时,那么很有可能您需要在 real-time operating system 上运行代码,甚至可能在 bare metal 上运行。
【解决方案2】:

延迟不能完全尊重我们设置的内容。例如,“Thread.sleep(1)”可能需要超过 10 毫秒才能执行。 “postDelayed()”方法也一样。分辨率取决于 CPU 和 current_load,在这些情况下,所有文档/指南都会警告这个“不是绝对准确”的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 2015-05-12
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多