1

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

  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 中显示的时间比实际服务器时间慢。我怀疑我上面使用的方法不够准确,无法更新时间。关于这个问题有什么建议吗?

4

1 回答 1

0

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

您应该改用SystemClock.elapsedRealtime()调用

Upd:对不起,我想我误解了这里的问题。您要做的是在未来一段时间后使用 postAtTime 发布可运行的内容。请注意,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
于 2012-08-29T09:49:03.247 回答