Android JobScheduler onStartJob 多次调用
Posted
技术标签:
【中文标题】Android JobScheduler onStartJob 多次调用【英文标题】:Android JobScheduler onStartJob called multiple times 【发布时间】:2015-11-11 19:16:24 【问题描述】:JobScheduler 多次调用onStartJob()
,尽管作业已完成。一切正常,如果我安排一个工作并等到它完成。但是,如果我同时安排两个或多个具有不同 ID 的作业,则在调用 jobFinished()
后会再次调用 onStartJob()
。
比如我调度job 1和job 2除了ID之外的参数完全相同,那么顺序是:
onStartJob()
工作 1 和工作 2
两个作业都完成了,所以两个作业都调用了jobFinished()
之后,onStartJob()
再次为具有相同 ID 的两个作业调用
我的工作很基础,并不复杂。
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
我不知道怎么了。
【问题讨论】:
我遇到了同样的问题,@vRallev。我可以避免作业运行两次的唯一方法是从onStartJob()
返回false
(即使我当时设置了AsyncTask
运行)。虽然这似乎对我有用,但我怀疑它将来会导致问题,系统认为工作已经完成并过早终止进程。你有没有找到解决这个问题的方法?
我记得工作是否已经开始。这对我有用,请参阅github.com/evernote/android-job/blob/master/library/src/main/… 和:github.com/evernote/android-job/blob/master/library/src/main/…
【参考方案1】:
我猜是挂起的Job引起的,所以我在服务启动后调用了mJobScheduler.cancelAll(),问题解决了。
【讨论】:
我不明白。您安排工作(JobService),然后立即调用 cancelAll()?难道不应该由 JobService 在完成后自行停止(并且不让系统再次启动它,根据 OP)吗?【参考方案2】:我认为这与报告的 Android 错误 here 有关,该错误显然已针对 Android N 进行了修复,但会出现在早期版本中。
OP 正在使用setOverrideDeadline()
。我对上面链接帖子中报告的问题的理解是,如果在覆盖期限触发时作业正在运行,则会导致作业被安排再次运行。
因此,建议确保在计划作业之前(不确定如何实现)或在作业完成之后触发覆盖。两者似乎都不是特别令人满意,但至少它似乎已经在 Android N 中得到了修复。
【讨论】:
【参考方案3】:这是 android lollypop 和 Marshmallow 中的问题。正如 Matthew Williams here 所解释的,它已在 Nougat 中修复。
【讨论】:
以上是关于Android JobScheduler onStartJob 多次调用的主要内容,如果未能解决你的问题,请参考以下文章
Android源码面试宝典之JobScheduler从使用到原理分析JSS的启动
Android JobScheduler onStartJob 多次调用
Android JobScheduler需要先检查是否正常工作,然后再运行其他任务
Android P JobScheduler服务源码解析 ——框架解析