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一次执行多次的主要内容,如果未能解决你的问题,请参考以下文章
在android中,为啥我的服务在按下电源按钮后没有进入睡眠状态