首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android处理程序作为计时器不准确

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

Stack Overflow用户
提问于 2013-12-06 00:22:10
回答 2查看 2.2K关注 0票数 2

我用Handler每10秒发送一次消息。当我关闭屏幕(设备进入睡眠模式)时,问题就会发生。每30秒-2分钟发送一次消息,而不是每10秒发送一次.为什么会发生这种情况?如何解决这个问题?

代码语言:javascript
运行
复制
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();
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-06 00:41:05

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

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

票数 3
EN

Stack Overflow用户

发布于 2015-04-08 21:52:48

我还看到了同样的情况,无论是处理程序还是计时器都没有给我一个准确的延迟,例如,延迟6000毫秒将给我在500到7000毫秒之间的延迟,这是非常恼人的。

使用尾流锁可能需要太多的电池。因此,这里我有一个助手类,它应该运行的时间,而不是使用postAtTime,并重新发布本身。它可以方便地在可变间隔内处理更复杂的不同任务的调度。

代码语言:javascript
运行
复制
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);
}
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20413598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档