如何在Android上以固定费率开始行动?

时间:2016-10-12 16:20:45

标签: java android timer scheduledexecutorservice

我的Android应用中有一项服务,必须每5分钟执行一次操作。

为了达到这个目的,我试图运行TimerTaskTimer.scheduleAtFixedRate方法,但速度似乎根本没有固定 - 经过几个小时的运行滴答停止,然后(在某些之后)小时!)计时器醒来并立即发射一系列几十个滴答声...根据the reference它的正常行为:

  

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

所以我不得不寻找另一种解决方案。

接下来,我按照scheduleAtFixedRate executes fast的回答尝试了ScheduledExecutorServicescheduleAtFixedRate方法。它也没有完全解决问题 - 我观察到相同的冻结,虽然它们更短(长达一个小时)。

我目前的代码很简单:

    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分钟是太多了。)

1 个答案:

答案 0 :(得分:1)

  

我的Android应用中有一项服务,必须每5分钟执行一次操作。为了达到这个目的,我试图运行TimerTask [...]    接下来我尝试了ScheduledExecutorService

我认为您使用错误的工具来完成任务,因为我认为AlarmManager是更好的选择。查看文档' Scheduling Repeating Alarms,并确保您了解API 19中引入的确切警报和不精确警报之间的区别(因为您绝对不希望后者)。