Android从睡眠状态返回后,周期性的timertask一次执行多次

Posted

技术标签:

【中文标题】Android从睡眠状态返回后,周期性的timertask一次执行多次【英文标题】:Periodic timertask executed several times at once after Android returns from sleep 【发布时间】:2020-06-16 16:03:45 【问题描述】:

我已经实现了一个后台服务来定期更新我的应用中的数据。 如果我的 android 设备已打开但在 Android 处于睡眠模式时会导致问题,则该机制运行良好:

假设服务每 15 分钟运行一次,然后 Android 进入睡眠状态 1 小时,当再次变弱时,该服务将一次执行 4 次。 首选行为将只运行一次服务,以防它因睡眠而错过 1 个或多个周期。

为了定期运行我的代码,我使用 TimerTask:

public class updateService extends IntentService 

public int onStartCommand(@Nullable Intent intent, int flags, int startId) 

        if(mTimer != null) 
            mTimer.cancel();
        
        mTimer = new Timer();

        int timer = getPreference("refresh_interval") * 1000;
        mTimer.scheduleAtFixedRate(new updateTask (), timer, timer);
        return super.onStartCommand(intent, flags, startId);
    

    class updateTask extends TimerTask 

        @Override
        public void run() 
            // run on another thread
            mHandler.post(new Runnable() 

                @Override
                public void run() 
                   // Do job
                
            );
           


如果有任何建议可以做得更好,我将不胜感激。谢谢!

【问题讨论】:

【参考方案1】:

如果由于任何原因(例如垃圾收集或其他后台活动)延迟执行,则后续执行也会延迟。他是对的

【讨论】:

【参考方案2】:

您正在使用Timer.scheduleAtFixedRate(TimerTask task, long delay, long period),在其文档中进行了解释:

如果由于任何原因(例如垃圾收集或其他后台活动)延迟执行,则会快速连续发生两次或多次执行以“赶上”。

您似乎想改用Timer.schedule(TimerTask task, long delay, long period),它说:

如果由于任何原因(例如垃圾回收或其他后台活动)延迟执行,后续执行也会延迟。

【讨论】:

哦,多么明显.. 我稍后再试,如果有帮助,请将您的答案标记为解决方案.. 谢谢

以上是关于Android从睡眠状态返回后,周期性的timertask一次执行多次的主要内容,如果未能解决你的问题,请参考以下文章

timer_start() 睡眠后的 C 不起作用

在android中,为啥我的服务在按下电源按钮后没有进入睡眠状态

如何防止 Android 设备从 Qt 应用程序进入睡眠状态

如何在睡眠模式下唤醒 Android Wear?

C#用timer控件做循环周期的问题

java线程