编辑:
这里不是说精度问题,从下面的代码和日志中可以看出,我要求休眠1秒,结果几乎是200秒,有时会跳到600秒,这不可能是精度问题。 .
我之前使用过handlerthread,有时发布到handler的工作没有按时开始,为了获得更多详细信息,我将其更改为基本线程,结果发现Thread.sleep()是问题所在,但我不是确定如何解决这个问题,可能的原因是什么?
hGpsThread = new Thread(mGpsWorker);
hGpsThread.start();
private final Runnable mGpsWorker = new Runnable() {
@Override
public void run() {
long lastGpsRequestTime = 0;
l.Write("GPS thread started.");
while (isRunning) {
l.Write("GPS thread loop start.");
try {
long currentTimeMillis = System.currentTimeMillis();
if (currentTimeMillis >= lastGpsRequestTime + gpsUpdateInterval) {
l.Write("Requesting location update");
gpslib.getLocation();
lastGpsRequestTime = currentTimeMillis;
}
l.Write("GPS thread before sleep");
Thread.sleep(1000);
l.Write("GPS thread after sleep");
} catch (InterruptedException e) {
}
l.Write("GPS thread loop end.");
}
l.Write("GPS thread ended.");
}
};
注意: getLocation() 使用来自另一个线程的循环器调用 requestLocationUpdates,因此据我所知,位置更新不应影响该线程。
getLocation() 还会创建一个 Timer 并安排一个超时,这可能是问题吗?据我了解,这应该不是问题。
这是日志:(这只是偶尔发生,说机会接近 0.5%)
Wed Jul 10 11:45:46 AEST 2013 GPS thread loop start.
Wed Jul 10 11:45:46 AEST 2013 GPS thread before sleep
Wed Jul 10 11:49:04 AEST 2013 GPS thread after sleep
Wed Jul 10 11:49:04 AEST 2013 GPS thread loop end.
谢谢
测试环境是:HTC Aria,Android 2.2看起来它只发生在使用电池运行时,但我的应用程序在充电状态下的行为并没有什么不同。