创建一个简单的StopWatch Timer安卓应用程序的准确性问题

时间:2015-08-06 11:34:21

标签: android precision postdelayed

我是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方法的延迟是以毫秒为单位,因此十倍于1厘秒。所以我每10ms递增一次厘米变量。太好了。

但是当我在我的设备上测试我的应用程序时,似乎秒数比他们应该的要慢。很可能与分割和模运算相对应的代码会导致滞后,从而阻碍增量并降低精度?

我已经将应用程序重写了0.1秒(十分之一秒)(通过:centiseconds / 10和%10以及postDelayed(...,100)),它似乎正在滴答作响。

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

1 个答案:

答案 0 :(得分:2)

这是错误的方法,因为您不能依赖系统消息队列作为精确刻度的来源,因为它不保证交付的任何精度。 postDelayed()将您的可运行队列排除不久而不是now + delay,但是由于许多原因导致准确的交付无法保证,并且由于长期运行会给您带来明显的累积测量误差。

但是,您可以使用postDelayed()来更新您的用户界面,但要了解您应该使用system clock方法的时间,而不是拥有计数器。

你还应该每次精确至少两次激活你的runnable,即如果你想每分钟更新一次计时器显示,你应该每分钟“勾选”两次,所以如果消息队列处理有任何延迟你的UI应该仍然每秒至少得到一个滴答。