【问题标题】:Android JobScheduler always works for 1 minuteAndroid JobScheduler 总是工作 1 分钟
【发布时间】:2014-12-31 09:45:34
【问题描述】:

我正在尝试使用新的 JobScheduler(由 tatarka 兼容)来实现后台刷新服务。 这是我的服务

@Override
public boolean onStartJob(JobParameters params) {
    Timber.i("on start job: " + params.getJobId());
    return true;
}

@Override
public boolean onStopJob(JobParameters params) {
    Timber.i("on stop job: " + params.getJobId());
    return true;
}

这是我的工作信息

public void scheduleJob(View v) {
    JobInfo job = new JobInfo.Builder(kJobId++ /*jobid*/, new ComponentName(getActivity(), RefreshJobService.class))
            .setPeriodic(2000)
            .build();
    mTestService.scheduleJob(job);
}

在日志中我看到我的工作总是工作 1 分钟 12-31 12:38:03.884 10059-10059/@/RefreshJobService﹕ on stop job: 0 12-31 12:39:03.891 10059-10059/@/RefreshJobService﹕ on start job: 0 12-31 12:40:03.911 10059-10059/@/RefreshJobService﹕ on stop job: 0 12-31 12:42:08.841 10059-10059/@/RefreshJobService﹕ on start job: 0 12-31 12:43:08.858 10059-10059/@/RefreshJobService﹕ on stop job: 0

那为什么?我将周期设置为 2000 毫秒,任何值都不会影响工作的 1 分钟间隔。为什么?

【问题讨论】:

  • 你知道这是为什么吗?
  • @Papajohn000 不,我没有。
  • 我不知道它是否仍然相关,但作业调度程序可能有最短时间限制。我知道警报管理器的最低限度是 2 分钟。
  • JobScheduler 真的不适合这么短的时间间隔。每隔几个小时刷新一次。在您的应用中使用 Handler.postDelayed 或类似名称。

标签: android android-jobscheduler


【解决方案1】:

在 Android 5.1.1 之前,单个作业的超时时间为 60 秒。从 Android 6 开始,超时时间现在为 10 分钟。

【讨论】:

    【解决方案2】:

    onStopJob 在系统想要取消你的工作时被调用。它取消您的工作的原因是因为它认为它仍在运行。您需要在工作中的某个时刻调用jobFinished(params, bool) 来告诉调度程序它已完成,否则它将超时并调用onStopJob 以取消它。此外,从onStartJob 返回“true”会告诉系统您尚未完成处理。你应该返回'false',除非你还在做额外的工作,例如。将工作交给单独的线程。

    @Override
    public boolean onStartJob(JobParameters params) {
        Timber.i("on start job: " + params.getJobId());
        jobFinished(params, false);
        return false;
    }
    

    【讨论】:

      【解决方案3】:

      从 API 26 (Oreo) 开始,为周期性作业设置小于 15 分钟的周期将至少在 15 分钟后执行。

      【讨论】:

        【解决方案4】:

        听起来你在问为什么你在工作开始一分钟后就开始了 onStopJob。 这 1 分钟的超时在代码 here 中定义

        【讨论】:

          【解决方案5】:

          43matthew 是正确的,但我想对此添加更多内容。您所说的 2000 毫秒是作业再次开始的周期性间隔,即每 2000 毫秒执行一次此作业,而不是作业将执行的间隔。

          【讨论】:

          • 我不认为这是正确的; Android 只保证它会在每 2000 毫秒间隔内“最多运行一次”。这意味着 (a) 它是一个间隔,并且 (b) 在此期间它可能根本不会执行您的工作。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-11
          • 1970-01-01
          相关资源
          最近更新 更多