Edit:
这里不是说精度问题,从下面的代码和日志可以看到,我请求休眠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() 还创建一个计时器并安排超时,这可能是问题所在吗?据我了解,这不应该是一个问题。
这是日志:(这种情况只是偶尔发生,假设几率接近 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.
Thanks
测试环境为:HTC Aria、Android 2.2
和好像它仅在使用电池运行时发生,但我的应用程序在充电状态上的行为没有不同。
基本上Thread.sleep()
and Handlers
只要屏幕打开就可以正常工作(意味着 Android 不应处于深度睡眠状态/屏幕关闭状态)。
当屏幕关闭时,默认的 Android 行为是挂起 Thread.sleep() 和 Handlers() ,直到屏幕再次打开或被某个应用程序获取唤醒锁唤醒。因此,如果屏幕始终打开,您的应用程序将完美运行,但当屏幕关闭时,它会表现得不稳定。
最好的解决方法是切换到AlarmManager
因为当警报被触发时,onRecieve()
默认情况下总是会获取唤醒锁,导致 Android 唤醒并执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)