在Android中同步时间

时间:2014-02-23 20:07:27

标签: android multithreading time

我正在尝试在两个Android设备之间同步时间。精度必须高达5毫秒。 gps和网络时间不是这么精确所以我想通过本地网络在设备之间共享时间并使用PTP(精确时间协议)同步时间。 现在因为我无法改变非根设备上的时间所以我考虑保存设备共享的时差,并继续在textview中显示用户的时间。 现在textview需要每隔ms更新一次,这样用户也可以以ms为单位查看时间。 我正在更新每个ms更新的线程中的textview。

class CountDownRunner implements Runnable {
    // @Override
    public void run() {
        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
        while (!Thread.currentThread().isInterrupted()) {
            try {
                setCurrentTime();
                Thread.sleep(1); // Pause of 1/100 Second
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            } catch (Exception e) {
            }
        }
    }
}

这就是问题出现的问题,在同步时间之后,时间差异小于5毫秒但是在同步一段时间后,时间开始漂移一部分,在10-15分钟后,时间差异超过1秒。 那么关于如何纠正这个问题的任何想法?

1 个答案:

答案 0 :(得分:0)

  

似乎使thread.sleep(1000)的工作方式更像thread.sleep(1003或1004),并且这些更改会继续增加以产生更大的漂移

正如我所说,Android不是RTOS。

此外,您不应该关心sleep()是否在1003或1004毫秒内返回。你似乎把两件事结合起来:

  • 确定自同步时间以来经过的时间
  • 显示当前的同步时间

这些与彼此无关

使用您的sleep()循环 - 或者,更好的是,postDelayed()以提高效率 - 以每秒控制粗略知道您需要更新TextView

要确定要在TextView中显示的值,请不要根据sleep()添加一些假设的时间。代替:

  • 当您从其他设备获取同步时间值时,也请保存the current value of SystemClock.elapsedRealtime()

  • 要确定自同步以来经过的时间(以毫秒为单位),请从当前调用elapsedRealtime()

  • 的值中减去elapsedRealtime()的保存值