Firebase Job Dispatcher

时间:2017-10-03 08:41:15

标签: android firebase-job-dispatcher

我正在创建一个需要向API发送请求的应用程序。此请求必须每2分钟发送一次。为此,我正在使用Firebase Job Dispatcher

问题是第一个请求是在时间发送的,但是下一个请求的发送时间更长:例如。

  • 第一次请求:2分钟后发送
  • 第二个请求:2.3分钟后发送(而不是两个)
  • 第三个请求:3.5分钟后发送(而不是两个)
  • 第四个请求:5分钟后发送(而不是两个)

你可以想象,一天之后,延迟将是30分钟甚至更长......

这是我用来创建作业的代码(在主要活动中 - onCreate)

        Job pingJob = mDispatcher.newJobBuilder()
            .setService(PingJob.class) // the job class to execute
            .setTag(PingJob.TAG) //tag - name of the job
            .setRecurring(true) // repeat
            .setTrigger(Trigger.executionWindow(60, 60*2))
            .setReplaceCurrent(false)
            .build();

    mDispatcher.mustSchedule(pingJob);

这是PingJob类(为了确保问题不是我在onStartJob上做的事情,我只放了一个日志):

public class PingJob extends Job {
    public static final String TAG = "ping_job";

    @Override
    public boolean onStartJob(final JobParameters params) {
        Log.d("ping job", "just put a log to see when is executed");
        jobFinished(params, true);
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }

}

我正在使用Android 6.0的Android机箱(但我的应用程序也必须在4.3设备上运行,因为我使用的是firebase而不是JobScheduler)和Google Play服务11.5.09(434)。

你有什么想法为什么这样做?如果有办法解决这个问题?如果没有,是否还有另外一种方法每2分钟做一次工作?

1 个答案:

答案 0 :(得分:1)

你没有做错任何事。这是一种设计的预期行为。 FirebaseJobDispatcher使用Google Play服务中的计划引擎,该引擎可能会在Android 5.0及更高版本的引擎盖下使用JobScheduler。 JobScheduler将来自不同应用程序的任务批处理为一批,不会经常唤醒设备并节省电池电量。因此,无法确保您的任务每2分钟执行一次。如果您需要此精度,请考虑使用不建议进行任何网络呼叫的AlarmManager,因为它会影响电池寿命。

为什么你甚至需要经常发送请求?考虑更多地考虑你正在做的事情。保存您在数据库或磁盘上发送到后端的数据可能更好。然后你可以每隔30-60分钟分批发送它或者适合你的任何东西。您还可以使用Firebase Cloud Messaging向设备发送消息,要求其在需要时将数据发送到后端。