为什么setOverrideDeadline不受尊重?

时间:2018-01-10 17:03:39

标签: android android-jobscheduler

我使用以下代码在网络可用时安排作业:

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的理解是,当网络可用时,或者不迟于15秒,我的工作将在5秒后触发。在实践中,如果我启用航空公司模式,并运行scheduleNextJob,则工作永远不会启动,直到我禁用航空公司模式。

那时,在我的工作中,isOverrideDeadlineExpired是真的,所以我很确定截止日期已经确定,它似乎并没有被尊重。

为什么覆盖截止日期没有得到尊重?

1 个答案:

答案 0 :(得分:5)

显然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();
};