启用RequirementsEnforced时,Evernote Android Job执行窗口结束时间是否被忽略?
Evernote Android Job:setRequirementsEnforced(true)对执行窗口的影响
先说说你的场景:你用Evernote的Android Job库调度了一个需要联网才能运行的任务,代码是这样的:
new JobRequest.Builder(DemoSyncJob.TAG) .setExecutionWindow(1L, SECONDS.toMillis(10)) .setRequiredNetworkType(CONNECTED) .setRequirementsEnforced(true) .build() .schedule();
你观察到一个现象:哪怕执行窗口的结束时间(也就是10秒后)已经过了,只要设备还没联网,调度器就会一直等,等联网后任务还是会跑。所以你疑惑,是不是设置setRequirementsEnforced(true)之后,setExecutionWindow的endInMs参数就被完全忽略了?
其实不是完全忽略,这里得拆解下这两个配置的逻辑关系:
setExecutionWindow(startInMs, endInMs):它的作用是告诉系统,任务「优先在这个时间窗口内执行」,是一个时间范围建议;setRequirementsEnforced(true):这是给任务加上了硬约束——必须满足所有指定的条件(这里就是联网),任务才能被执行。
具体的执行逻辑是这样的:
- 如果在执行窗口的时间范围内,设备满足了联网要求,系统会在窗口内挑选合适的时机执行任务,这时候
endInMs是正常生效的; - 如果执行窗口结束了,但联网要求还没满足,因为你设置了
setRequirementsEnforced(true),任务不会被直接丢弃,而是会进入等待队列,直到联网条件满足后,立刻(或系统调度合适时机)执行任务。
简单说,endInMs不是被完全忽略,而是当约束条件未满足时,任务的执行会突破窗口的时间限制——毕竟你明确要求了必须满足条件才执行,系统不会因为时间到了就放弃这个任务。
反过来,如果把setRequirementsEnforced(false),那当执行窗口结束时,不管有没有联网,任务都会被取消,不会再执行,这时候endInMs就是严格生效的。
内容的提问来源于stack exchange,提问作者Piotr Aleksander Chmielowski
相关产品推荐
相关产品推荐

