【问题标题】:Android JobScheduler onStartJob called multiple timesAndroid JobScheduler onStartJob 多次调用
【发布时间】:2015-11-11 19:16:24
【问题描述】:

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

比如我调度job 1和job 2除了ID之外的参数完全相同,那么顺序是:

  1. onStartJob() 工作 1 和工作 2
  2. 两个作业都完成了,所以两个作业都调用了jobFinished()
  3. 之后,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

我不知道怎么了。

【问题讨论】:

标签: android jobs job-scheduling


【解决方案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 中修复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多