我正在创建一个需要向API发送请求的应用程序。此请求必须每2分钟发送一次。为此,我正在使用Firebase Job Dispatcher
问题是第一个请求是在时间发送的,但是下一个请求会以更大的延迟发送:例如。
- 第一个请求:2分钟后发送
- 第二个请求:2.3分钟后发送(而不是两个)
- 第三请求:3.5分钟后发送(而不是两个)
- 第四请求:5分钟后发送(而不是两个)
您可以想象,一天后,延迟将为30分钟甚至更长时间...
这是我用来创建作业的代码(在主要活动中 - ongreate)
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 Services 11.5.09(434)。p>您有什么想法为什么要这样做?如果有办法解决这个问题吗?如果没有,是否有另一种方法每2分钟工作?
您没有做错任何事情。这是一种设计的预期行为。FirebaseJobdisPatcher在Google Play服务中使用了调度引擎,该引擎很可能在Android 5.0及更高范围内使用Hood下方的JobsCheduler。JobsCheduler将任务从不同的应用程序批量分为一批,以免经常唤醒设备并节省电池。因此,无法保证您的任务将每2分钟完全执行一次。如果您需要此精确度,请考虑使用AlarmManager,而不建议这样做任何网络调用,因为它会影响电池寿命。
为什么您甚至需要经常发送请求?考虑更多地考虑您的工作。最好保存要在数据库或磁盘上发送到后端的数据。然后,您可以每30-60分钟分批发送一次或对您有用的任何东西。您还可以使用Firebase Cloud Messaging将消息发送到设备,以要求其在需要时将数据发送到后端。