Android JobScheduler onStartJob被多次调用

17

即使作业已经完成,JobScheduler仍会多次调用onStartJob()。如果我只安排一个单一的作业并等待它完成,一切都正常。但是,如果我同时安排两个或更多具有不同ID的作业,则在调用jobFinished()之后,onStartJob()将再次被调用。

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

  1. 作业1和作业2的onStartJob()
  2. 两个作业完成,因此为它们的jobFinished()调用
  3. 之后,对于具有相同ID的两个作业,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

我不知道哪里出了问题。


我和@vRallev遇到了同样的问题。我能想到的唯一避免任务运行两次的方法是在onStartJob()中返回false(即使此时我已经设置了一个AsyncTask正在运行)。虽然这对我来说似乎有效,但我怀疑它会在未来引起问题,因为系统会认为任务已经完成并过早地终止进程。你有找到解决办法吗? - drmrbrewer
我记得如果一个工作已经开始了。这对我很有效,详见 https://github.com/evernote/android-job/blob/master/library/src/main/java/com/evernote/android/job/v21/PlatformJobService.java。和:https://github.com/evernote/android-job/blob/master/library/src/main/java/com/evernote/android/job/JobProxy.java#L110 - vRallev
3个回答

4

我猜这是由于未完成的任务引起的,所以在服务启动后,我调用了mJobScheduler.cancelAll(),问题得到解决。


2
我不明白。你安排了工作(JobService),然后立即调用cancellAll()吗?当工作完成时,难道不应该由JobService自行停止(而不是让系统重新启动它,如OP所述)? - drmrbrewer

3
我认为这与在此处报告的Android漏洞有关(链接),该漏洞似乎已经在Android N中修复,但在早期版本中仍然存在。
OP正在使用setOverrideDeadline()。 我对上面链接帖子中报道的问题的理解是,如果作业在覆盖截止日期触发时正在运行,则会导致该作业再次被安排运行。
因此,建议确保覆盖在作业计划之前触发(不确定如何实现),或者在作业完成后触发。 两者都不是特别令人满意,但至少在Android N中似乎已经修复了这个问题。

1
这是关于Android 5.0和6.0的问题。在Nougat中得到了解决,如Matthew Williams在这里所述。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接