0

我正在创建一个需要向 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.1 的 Android 机器(但我的应用程序也必须在 4.3 设备上运行,这就是我使用 firebase 而不是 JobScheduler 的原因)和 Google Play 服务 11.5.09 (434)。

你有什么想法为什么要这样做?如果有办法解决这个问题?如果没有,还有其他方法可以每 2 分钟完成一次工作吗?

4

1 回答 1

2

你没有做错什么。这是设计的预期行为。FirebaseJobDispatcher 在 Google Play 服务中使用调度引擎,它可能在 Android 5.0 及更高版本的后台使用JobScheduler。JobScheduler 将来自不同应用程序的任务批处理到一个批处理中,以免过于频繁地唤醒设备并节省电池。因此,不能保证您的任务将每 2 分钟准确执行一次。如果您需要这种精度,请考虑使用不建议进行任何网络调用的AlarmManager ,因为它会影响电池寿命。

为什么你甚至需要如此频繁地发送请求?考虑更多地考虑你在做什么。将发送到后端的数据保存在数据库或磁盘中可能会更好。然后,您可以每 30-60 分钟或任何适合您的方式分批发送。您还可以使用Firebase Cloud Messaging向设备发送消息,要求其在需要时将数据发送到后端。

于 2017-10-03T08:54:00.533 回答