JobScheduler多次调用onStartJob()
,但作业已完成。一切工作正常,如果我安排一个单一的工作,并等到它完成。但是,如果我同时安排两个或多个具有不同ID的作业,则在调用onStartJob()
后会再次调用jobFinished()
。
例如,我安排作业1和作业2使用完全相同的参数(ID除外),然后顺序为:
onStartJob()
jobFinished()
onStartJob()
我的工作非常基础而且并不复杂。
public class MyJobService extends JobService {
@Override
public boolean onStartJob(final JobParameters params) {
new Thread(new Runnable() {
@Override
public void run() {
try {
// do something
} finally {
// do not reschedule
jobFinished(params, false);
}
}
}).start();
// yes, job running in the background
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
// mark my background task as stopped
// do not reschedule
return false;
}
}
我安排这样的工作
JobInfo jobInfo = createBaseBuilder(request)
.setMinimumLatency(2_000L)
.setOverrideDeadline(4_000L)
.setRequiresCharging(false)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.build();
int scheduleResult = mJobScheduler.schedule(jobInfo);
// is always success
我不知道出了什么问题。
答案 0 :(得分:4)
我猜它是由挂起的Job引起的,所以我在服务启动后调用了mJobScheduler.cancelAll(),问题解决了。
答案 1 :(得分:3)
我认为这与报告的here Android漏洞有关,该漏洞显然已针对Android N修复,但将出现在早期版本中。
OP正在使用setOverrideDeadline()
。我对上面链接帖子中报告的问题的理解是,如果在覆盖截止日期触发时作业正在运行,则会导致作业被安排再次运行。
所以建议是确保在安排作业之前触发覆盖(不确定如何实现)或者在完成之后触发。两者似乎都不是特别令人满意,但至少它似乎已在Android N中得到修复。
答案 2 :(得分:1)
这是android lollypop和Marshmallow中的问题。正如马修·威廉姆斯here
所解释的那样,它在牛轧糖中得以修复