Android JobScheduler onStartJob多次调用

时间:2015-08-18 17:54:02

标签: android jobs job-scheduling

JobScheduler多次调用onStartJob(),但作业已完成。一切工作正常,如果我安排一个单一的工作,并等到它完成。但是,如果我同时安排两个或多个具有不同ID的作业,则在调用onStartJob()后会再次调用jobFinished()

例如,我安排作业1和作业2使用完全相同的参数(ID除外),然后顺序为:

    对于工作1和工作2
  1. onStartJob()
  2. 两个作业都完成了,因此为这两个作业调用jobFinished()
  3. 之后,对于具有相同ID的两个作业再次调用onStartJob()
  4. 我的工作非常基础而且并不复杂。

    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
    

    我不知道出了什么问题。

3 个答案:

答案 0 :(得分:4)

我猜它是由挂起的Job引起的,所以我在服务启动后调用了mJobScheduler.cancelAll(),问题解决了。

答案 1 :(得分:3)

我认为这与报告的here Android漏洞有关,该漏洞显然已针对Android N修复,但将出现在早期版本中。

OP正在使用setOverrideDeadline()。我对上面链接帖子中报告的问题的理解是,如果在覆盖截止日期触发时作业正在运行,则会导致作业被安排再次运行。

所以建议是确保在安排作业之前触发覆盖(不确定如何实现)或者在完成之后触发。两者似乎都不是特别令人满意,但至少它似乎已在Android N中得到修复。

答案 2 :(得分:1)

这是android lollypop和Marshmallow中的问题。正如马修·威廉姆斯here

所解释的那样,它在牛轧糖中得以修复