我的Android应用中有一项服务,必须每5分钟执行一次操作。
为了达到这个目的,我试图运行TimerTask
到Timer.scheduleAtFixedRate
方法,但速度似乎根本没有固定 - 经过几个小时的运行滴答停止,然后(在某些之后)小时!)计时器醒来并立即发射一系列几十个滴答声...根据the reference它的正常行为:
如果由于任何原因(例如垃圾收集或其他后台活动)导致执行被延迟,则会快速连续执行两次或更多次执行以“赶上”。
所以我不得不寻找另一种解决方案。
接下来,我按照scheduleAtFixedRate executes fast的回答尝试了ScheduledExecutorService
和scheduleAtFixedRate
方法。它也没有完全解决问题 - 我观察到相同的冻结,虽然它们更短(长达一个小时)。
我目前的代码很简单:
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Log.d(LOG_TAG, "Schedule run");
mHandler.post(new Runnable() {
@Override
public void run() {
Log.d(LOG_TAG, "Call timer");
serviceHelper.doAction();
Log.d(LOG_TAG, "Task complete");
}
});
}
}, 0, AppConstant.NOTIFY_INTERVAL, TimeUnit.MILLISECONDS);
所以,我需要一个如何增加时间表稳定性的建议(差距为-3分钟是可以接受的,但是10到30分钟是太多了。)
答案 0 :(得分:1)
我的Android应用中有一项服务,必须每5分钟执行一次操作。为了达到这个目的,我试图运行TimerTask [...] 接下来我尝试了ScheduledExecutorService
我认为您使用错误的工具来完成任务,因为我认为AlarmManager是更好的选择。查看文档' Scheduling Repeating Alarms,并确保您了解API 19中引入的确切警报和不精确警报之间的区别(因为您绝对不希望后者)。