Android Thread.sleep有时等待太久了

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 看起来它只在电池上运行时发生,但我的应用程序对充电状态的行为不同.

Roy*_*nto 9

基本上Thread.sleep()Handlers精细工作,只要在屏幕上(意味着Android的不应该是在深度睡眠状态/屏幕关闭状态).

当屏幕关闭时,默认的Android行为是暂停Thread.sleep()和Handlers(),直到再次重新打开屏幕或某些应用程序获取唤醒锁被唤醒.因此,如果屏幕全部打开,您的应用程序将完美运行,但是当它关​​闭时,它将表现不正常.

最好的解决方法是切换到AlarmManager因为触发警报时onRecieve(),默认情况下总是抓住唤醒锁,导致Android唤醒并执行.