【发布时间】:2013-07-10 02:09:00
【问题描述】:
编辑:
这里不是说精度问题,从下面的代码和日志可以看出,我请求休眠1秒,结果却快200秒了,有时候能跳到600秒,这不可能精度问题..
我以前使用 handlerthread,有时发布到处理程序的作业没有按时开始,为了获得更多详细信息,我将其更改为基本线程,结果发现 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 看起来它只在使用电池运行时发生,但我的应用在充电状态下的行为并没有什么不同。
【问题讨论】:
-
注释掉
getLocation()会出现这种情况吗?看起来另一个线程并没有放弃 CPU,一旦这个线程进入sleep。 -
@Aert,谢谢,我现在正在监控 CPU 使用率,如果我发现了什么,我会更新问题,谢谢。
-
当Android显示器被电源按钮关闭或显示超时时,您是否这样做?
-
@RoystonPinto 是的,上面的代码来自前台服务类。实际上它看起来确实只在显示器关闭时发生!这也可以解释为什么在连接电源时没有发生这种情况,因为我将显示器设置为在连接电源时始终打开......所以有什么区别吗?
-
是的,当显示器关闭时,处理程序和线程将暂停,直到被另一个应用程序中的某些唤醒锁唤醒或打开显示器时。因此,您观察到的随机行为是正确的。如果您在显示屏关闭时需要正确的行为,请切换到 AlarmManager,因为即使显示屏关闭也可以使用。