Android JobScheduler 运行 使用 setPeriodic() 时太频繁了
Android JobScheduler running way too often when using setPeriodic()
我注意到我预定的 JobScheduler 执行作业的方式太频繁了。我将它设置为每天执行,它需要空闲、连接到 wlan 并正在充电,但是当满足这些条件时,作业每 10 分钟或更频繁地执行一次。
我的代码:
JobInfo.Builder builder = new JobInfo.Builder(1,
new ComponentName(context.getPackageName(), SyncJobService.class.getName()));
builder.setPeriodic(TimeUnit.DAYS.toMillis(1))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setRequiresCharging(true)
.setRequiresDeviceIdle(true);
int code = jobScheduler.schedule(builder.build());
if (code <= 0) {
Log.e(TAG, "Could not scheduled job: " + code);
return;
}
Log.e(TAG, "Scheduled job");
作业执行后台线程从互联网下载数据,数据下载完成后我调用
mService.jobFinished(mParams, true);
通知作业调度程序作业已完成,它应该重新安排它。为什么即使将周期设置为一天,作业也会如此频繁地执行?我的 android 6.0.1 设备几乎从不进入休眠模式,因为作业 运行 太频繁了。
after the data download is done I call mService.jobFinished(mParams, true);
to notify the job scheduler that the job is done and it should reschedule it
这就是你的问题所在。使用 false
,而不是 true
.
false
表示,"the work is done for this job"。 true
表示 "we had a problem, please reschedule this job again to happen soonish"。例如,条件表明您必须具有 Internet 连接,但您可能难以连接到您的服务器。既然如此,returntrue
,希望问题能稍微解决
您还可以考虑调整退避规则 via setBackoffCriteria()
以应对您确实想要 return true
.
的情况
我注意到我预定的 JobScheduler 执行作业的方式太频繁了。我将它设置为每天执行,它需要空闲、连接到 wlan 并正在充电,但是当满足这些条件时,作业每 10 分钟或更频繁地执行一次。
我的代码:
JobInfo.Builder builder = new JobInfo.Builder(1,
new ComponentName(context.getPackageName(), SyncJobService.class.getName()));
builder.setPeriodic(TimeUnit.DAYS.toMillis(1))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setRequiresCharging(true)
.setRequiresDeviceIdle(true);
int code = jobScheduler.schedule(builder.build());
if (code <= 0) {
Log.e(TAG, "Could not scheduled job: " + code);
return;
}
Log.e(TAG, "Scheduled job");
作业执行后台线程从互联网下载数据,数据下载完成后我调用
mService.jobFinished(mParams, true);
通知作业调度程序作业已完成,它应该重新安排它。为什么即使将周期设置为一天,作业也会如此频繁地执行?我的 android 6.0.1 设备几乎从不进入休眠模式,因为作业 运行 太频繁了。
after the data download is done I call
mService.jobFinished(mParams, true);
to notify the job scheduler that the job is done and it should reschedule it
这就是你的问题所在。使用 false
,而不是 true
.
false
表示,"the work is done for this job"。 true
表示 "we had a problem, please reschedule this job again to happen soonish"。例如,条件表明您必须具有 Internet 连接,但您可能难以连接到您的服务器。既然如此,returntrue
,希望问题能稍微解决
您还可以考虑调整退避规则 via setBackoffCriteria()
以应对您确实想要 return true
.