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服务源码解析 ——框架解析

Android P JobScheduler服务源码解析 ——框架解析

Android进阶——更节电的后台任务JobScheduler 机制使用详解