使用JobScheduler执行重复任务时,如何正确调用jobFinished()?
JobScheduler 周期性任务中 jobFinished() 参数的正确选择
嘿,我正好对这个点比较熟悉,给你掰扯清楚:
直接给结论
如果你想让任务严格按照你设置的周期重复执行,必须调用 jobFinished(parameters, false)。
两个参数的本质区别
jobFinished() 的第二个参数 needsReschedule,是在告诉系统「这次任务结束后,要不要重新安排这个任务」:
- 传
false:系统判定任务正常完成,会完全遵循你之前setPeriodic(interval)设定的时间间隔,到点就触发下一次任务,完美契合你的需求。 - 传
true:系统会把任务标记为「需要重新调度」,但这时候不会遵守你设置的周期,而是会根据系统的调度规则(比如设备是否空闲、是否在充电等)来决定什么时候再次执行,大概率会打乱你想要的固定周期。
结合你的代码分析
看你写的 completeRestore 方法里已经用了 jobFinished(parameters, false),这其实是完全正确的!因为你设置了每10秒执行一次,传false就能让系统老老实实按这个周期跑。
另外再给你提两个小细节:
- 你的
onStartJob返回true是对的,因为你在子线程执行任务,返回true会告诉系统「任务还在后台跑呢,等我调用jobFinished再算结束」。 onStopJob返回false,意思是如果系统因为资源紧张把任务停了,就不再重新调度它,这个逻辑如果符合你的业务需求就没问题。
最后把你代码里的关键部分标出来(你当前的写法是正确的):
fun completeRestore(parameters: JobParameters) { logError("Starting") // 正确:保证任务按设定周期重复执行 jobFinished(parameters, false) }
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

