为什么不遵守 setOverrideDeadline?
Why is setOverrideDeadline not respected?
我使用以下代码在网络可用时安排工作:
static JobScheduler jobScheduler(Context context) {
return (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
}
static JobInfo jobInfo(Context context, Date nextTime) {
return new JobInfo.Builder((int) R.string.action_send_mail, new ComponentName(context, MessageJobService.class))
.setMinimumLatency(max(0, nextTime.getTime() - System.currentTimeMillis()))
.setOverrideDeadline(15 * 1000)
.setBackoffCriteria(5000, JobInfo.BACKOFF_POLICY_EXPONENTIAL)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.build();
};
public static void scheduleNextJob(Context context) {
MailMessage mailMessage = DbHelper.inContext(context).loadNextMessage();
if(mailMessage != null) {
jobScheduler(context).schedule(jobInfo(context, mailMessage.getNextAttempt()));
}
}
我对 setOverrideDeadline
的理解是,当网络可用时,我的作业将在 5 秒后触发,或不迟于 15 秒。实际上,如果我启用航空公司模式,并且 运行 scheduleNextJob
在我禁用航空公司模式之前,作业永远不会触发。
那时,在我的工作中,isOverrideDeadlineExpired
是正确的,所以我很确定截止日期已经确定,只是似乎没有得到遵守。
为什么没有遵守覆盖截止日期?
显然 setMinimumLatency(0)
和 setOverrideDeadline
的组合没有按预期工作。将最小延迟更改为至少 1 似乎可以解决问题:
static JobInfo jobInfo(Context context, Date nextTime) {
return new JobInfo.Builder((int) R.string.action_send_mail, new ComponentName(context, MessageJobService.class))
.setMinimumLatency(max(1, nextTime.getTime() - System.currentTimeMillis()))
.setOverrideDeadline(15 * 1000)
.setBackoffCriteria(5000, JobInfo.BACKOFF_POLICY_EXPONENTIAL)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.build();
};
我使用以下代码在网络可用时安排工作:
static JobScheduler jobScheduler(Context context) {
return (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
}
static JobInfo jobInfo(Context context, Date nextTime) {
return new JobInfo.Builder((int) R.string.action_send_mail, new ComponentName(context, MessageJobService.class))
.setMinimumLatency(max(0, nextTime.getTime() - System.currentTimeMillis()))
.setOverrideDeadline(15 * 1000)
.setBackoffCriteria(5000, JobInfo.BACKOFF_POLICY_EXPONENTIAL)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.build();
};
public static void scheduleNextJob(Context context) {
MailMessage mailMessage = DbHelper.inContext(context).loadNextMessage();
if(mailMessage != null) {
jobScheduler(context).schedule(jobInfo(context, mailMessage.getNextAttempt()));
}
}
我对 setOverrideDeadline
的理解是,当网络可用时,我的作业将在 5 秒后触发,或不迟于 15 秒。实际上,如果我启用航空公司模式,并且 运行 scheduleNextJob
在我禁用航空公司模式之前,作业永远不会触发。
那时,在我的工作中,isOverrideDeadlineExpired
是正确的,所以我很确定截止日期已经确定,只是似乎没有得到遵守。
为什么没有遵守覆盖截止日期?
显然 setMinimumLatency(0)
和 setOverrideDeadline
的组合没有按预期工作。将最小延迟更改为至少 1 似乎可以解决问题:
static JobInfo jobInfo(Context context, Date nextTime) {
return new JobInfo.Builder((int) R.string.action_send_mail, new ComponentName(context, MessageJobService.class))
.setMinimumLatency(max(1, nextTime.getTime() - System.currentTimeMillis()))
.setOverrideDeadline(15 * 1000)
.setBackoffCriteria(5000, JobInfo.BACKOFF_POLICY_EXPONENTIAL)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.build();
};