如何让Android自定义时钟时间准确?

时间:2012-08-29 09:33:13

标签: android timer handler

我制作了一个appWidget,显示服务器的当前时间(例如2012-08-29,12:00:08)。我每个修复持续时间(例如1小时)请求服务器时间。如果收到服务器时间,则更新appWidget显示。在此期间,我启动一个Handler来更新时间,如下所示:

  mTick = new Runnable() {
        public void run() {
            mMillis += 1000;
            long now = SystemClock.uptimeMillis();
            long next = now + (1000 - now % 1000);
            mHandler.postAtTime(mTicker, next);
        }
    }
    mTicker.run();

我的问题: 1经过很长时间(一天过去),AppWidget中显示的时间比实际服务器时间慢。 我怀疑上面使用的方法不够准确,无法更新时间。 有关此问题的任何建议吗?

1 个答案:

答案 0 :(得分:0)

您不应该使用SystemClock.uptimeMillis(),因为它不包括深度睡眠所花费的时间,这就是您的应用小部件不同步的原因。

您应该使用SystemClock.elapsedRealtime()来电话

更新:对不起,我想我在这里误解了这个问题。你要做的是在将来的一段时间后使用postAtTime发布runnable。请注意,postAtTime不包括设备处于深度睡眠状态的时间。

您需要的是在重绘窗口小部件之间跟踪准确的增量。你应该使用SystemClock.elapsedRealtime()。

算法应该是这样的:

long serverTime = getServerTime();
long lastTime = SystemClock.elapsedRealtime();

// Somewhere in updateWidget() or call on timer:
serverTime = serverTime  + SystemClock.elapsedRealtime() - lastTime;
lastTime = SystemClock.elapsedRealtime();
// At this moment in serverTime variable you have "server" time adjusted by the time which passed on device, including time spent in deep sleep