在创建一个简单的秒表计时器安卓应用程序的准确性问题



我是Android开发新手。我想制作一个精度为0.01秒的秒表。以下是我的部分代码(我认为问题在其中):

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方法的延迟是以毫秒为单位的,所以它的10倍将是1厘秒。所以厘秒变量每增加10ms。到目前为止一切顺利。

但是当我在我的设备上测试我的应用程序时,似乎秒比他们应该慢。是否可能是除法和模运算对应的代码造成了很大的延迟,从而阻碍了增量,降低了精度?

我已经重写了0.1秒的应用程序(decisseconds)(通过:厘秒/10和% 10和postDelayed(…, 100)),而且它似乎是正确的。

注:
这就是我的4.3 Jellybean秒表只有0.1秒精度的原因吗?
对于这样的应用程序,android的精度限制是什么?

这是错误的方法,因为您不能依赖系统消息队列作为精确标记的来源,因为它不能保证传递中的任何精度。postDelayed()队列可运行的交付不会比now + delay更快,但不能保证精确交付,并且由于许多原因可能会发生额外的延迟,这些延迟在长期运行中会给您带来明显的测量累积误差。

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

你还应该触发你的runnable至少两次每精度,即,如果你想更新计时器显示每分钟一次,你应该"滴答"每分钟两次,所以如果有任何延迟在消息队列处理你的UI仍然至少得到一个滴答每秒的时间

最新更新