创建简单的秒表计时器 ​​android 应用程序时出现准确性问题

Accuracy issue in creating a simple StopWatch Timer android app

我是 Android 的新手 development.I 想创建一个精度为 0.01 的秒表 seconds.Here 是我代码的一部分(我认为问题出在其中):

private void runTimer()
{
    final TextView timeView = (TextView) findViewById(R.id.time_view);
    final Handler handler = new Handler();
    handler.post(new Runnable() {
        @Override
        public void run() {
            int seconds = centiseconds / 100;
            int centisecs = centiseconds % 100;
            int hours = seconds / 3600;
            int minutes = (seconds % 3600) / 60;
            int secs = seconds % 60;

            String time = String.format("%d:%02d:%02d.%02d", hours, minutes, secs, centisecs);
            timeView.setText(time);
            if (isRunning) {
                centiseconds += 1;
            }
            handler.postDelayed(this, 10);
        }
    });
    }

}

由于postDelayed方法的延迟是以毫秒为单位的,十倍就是1厘秒。所以我每隔 10ms.So 就递增我的厘秒变量,这很好。

但是当我在我的设备上测试我的应用程序时,似乎秒数比他们应该的慢。难不成是除法和取模运算对应的代码造成了很大的滞后,阻碍了递增,降低了精度?

我重写了应用程序 0.1 秒(分秒)(通过:厘秒/10 和 % 10 和 postDelayed(..., 100) ),它似乎正确地滴答作响。

P.S.
这就是我的 4.3 Jellybean 秒表准确度为 0.1 秒的原因吗?
此类应用程序 android 的精度限制是多少? (及时的有 0.01 秒所以我认为它至少是 0.01 秒)

这是错误的方法,因为您不能依赖系统消息队列作为精确滴答的来源,因为它不能保证传递的任何精度。 postDelayed() 将您的 运行 送达队列 不早于 now + delay 但为了准确送达,不保证准确送达,并且由于多种原因可能会发生额外的延误更长的 运行 会给您带来明显的测量累积误差。

不过,您可以使用 postDelayed() 来更新您的 UI,但要知道经过了多少时间,您应该使用 system clock 方法,而不是自己的计数器。

您还应该每个精度至少触发两次 运行nable,即如果您想每分钟更新一次计时器显示,您应该每分钟 "tick" 两次,这样如果有处理您的消息队列中的任何延迟 UI 仍应按时至少每秒得到一个滴答声。