Android处理程序作为计时器不准确

时间:2013-12-06 00:22:10

标签: android timer handler delay sleep

我正在使用Handler每隔10秒发送一条消息。当我关闭屏幕(设备进入睡眠模式)时会出现问题。消息每30秒发送一次 - 2分钟而不是每10秒发送一次。为什么会这样?如何解决这个问题?

public void PingTask() {        
    handler = new Handler();        
    runnable = new Runnable() {
        @Override
        public void run() {
            try {
                sendMSG("ping");
            } catch (Exception e) {}
            handler.postDelayed(this, 10000);
        }
    };
    runnable.run();
}

从AsyncTask调用PingTask() - onPostExecute()。

2 个答案:

答案 0 :(得分:2)

Android正在关闭你的CPU。使用WakeLock可防止您的设备进入某种睡眠模式。

您还可以使用alarmmanager每秒发送一条消息。警报管理器会自动阻止您的设备进入睡眠模式。

答案 1 :(得分:2)

我也看到同样的事情,处理程序或计时器都没有给我一个准确的延迟,例如放入6000毫秒的延迟会给我延迟500-7000毫秒之间的延迟,这非常烦人。

使用唤醒锁可能会使用太多电池。所以在这里我有一个辅助类,它应该运行的时间,使用postAtTime代替并重新发布自己。它可以轻松地以可变间隔处理更复杂的不同任务计划。

public void PingTask() {  
    /** here is how to use it */
    IntervalTask task = new IntervalTask();
    task.run();
}

class IntervalTask implements Runnable{
long runAtTime = 0;
Handler handler = new Handler();

public void run(){
    /** According to documentation, it uses uptimeMillis */
    long currentTime = SystemClock.uptimeMillis();

    /** only do it if it is time */
    if (currentTime > runAtTime){
        /** update it */
        runAtTime = currentTime + 10000;

        /** do you what you want to do here */
        sendMSG("ping");
    }

    handler.postAtTime(this, runAtTime);
}
}