ago*_*gou 3 multithreading android
编辑:
这不是谈论精度问题,从下面的代码和日志中,你可以看到我要求睡眠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.");
}
};
Run Code Online (Sandbox Code Playgroud)
注意: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.
Run Code Online (Sandbox Code Playgroud)
谢谢
测试环境是:HTC Aria,Android 2.2 看起来它只在电池上运行时发生,但我的应用程序对充电状态的行为不同.
基本上Thread.sleep()和Handlers精细工作,只要在屏幕上(意味着Android的不应该是在深度睡眠状态/屏幕关闭状态).
当屏幕关闭时,默认的Android行为是暂停Thread.sleep()和Handlers(),直到再次重新打开屏幕或某些应用程序获取唤醒锁被唤醒.因此,如果屏幕全部打开,您的应用程序将完美运行,但是当它关闭时,它将表现不正常.
最好的解决方法是切换到AlarmManager因为触发警报时onRecieve(),默认情况下总是抓住唤醒锁,导致Android唤醒并执行.
| 归档时间: |
|
| 查看次数: |
2431 次 |
| 最近记录: |