【问题标题】:JobScheduler Periodic JobJobScheduler 定期作业
【发布时间】:2018-11-21 15:03:20
【问题描述】:

当我们创建一个 Job 时,我们可以设置很多 preperties,而 setPeriodic(interval) 对我来说有点混乱。文档说 setPeriodic 用于“指定此作业应以提供的间隔重复每个周期不超过一次”。

  • 所以,我想,如果我将它设置为 15 分钟,它不会每 15 分钟执行一次作业(前提是我没有为该作业指定任何其他条件)——它只是确保作业执行不超过在我为 Job 设置的时间间隔内一次,可能需要一个小时才能重新开始?
  • JobService 有一个方法 jobFinished(),它接受一个布尔值 needsReschedule,如果我将它设置为 false,如果我为其设置 setPeriodic(1000 * 60 * 15),那么 Job 将来还会重复吗?

我问这个是因为我已经在工作中测试过它:

 JobInfo.Builder jobInfoBuilder = new JobInfo.Builder(JOB_ID, mServiceComponent)
                    .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                    .setPeriodic(1000 * 60 * 15);

            mJobScheduler.schedule(jobInfoBuilder.build());

并且该作业在 30 分钟内没有再次执行(之后我不再等待它)。

【问题讨论】:

    标签: android


    【解决方案1】:

    文档说 setPeriodic 用于“指定此作业应以提供的间隔重复,每个周期不超过一次”。

    是的,它确保此作业仅在指定宽度的间隔内执行一次。实际执行时间取决于操作系统,取决于作业批处理等条件,以尽量减少手机需要从空闲状态唤醒的次数。

    所以,我想,如果我将它设置为 15 分钟,它不会每 15 分钟执行一次作业(前提是我没有为该作业指定任何其他条件)——它只是确保作业执行不超过在我为 Job 设置的时间间隔内一次,可能需要一个小时才能重新开始?

    第一次调用作业将在您的代码调用 schedule 后的 15 分钟时间窗口内。之后,由于它是周期性的,它将在接下来的 15 分钟内再次执行 从最后一个作业完成的点,依此类推。通过在另一个 setPeriodic 方法中设置 flexMillis 参数,我们对在此时间间隔内执行作业的时间进行了有限的控制。

    假设您的作业的第一个执行是 Job1。完成后,它会安排下一个作业实例 - Job2。 Job2 现在有 2 个边界 - 在 Job1 的时间间隔结束之前它不能再次运行,它必须在它自己的 15 分钟时间间隔结束之前运行。

    并且 JobService 有一个方法 jobFinished() 需要一个布尔值 needsReschedule,如果我将其设置为 false,如果我为其设置 setPeriodic(1000 * 60 * 15),作业是否还会在未来重复自己?

    wantsReschedule参数在docs中解释如下:

    boolean:如果该作业应根据首次调度时指定的回退标准重新调度,则为 true;否则为假。

    这里的“工作”是指您的周期性工作的特定实例,而不是原始的周期性工作。假设您正在查询服务器以每小时显示通知,并且当作业执行时,由于缺乏互联网,它无法获取数据。您的作业可能已经执行完毕,但不满足更新数据的要求。如果您将参数设置为true,则此周期性作业的实例 将尝试根据回退策略(默认情况下应为指数)重复自身。由于它被认为是同一个实例,它不违反“不会重复多次”的条件。

    这意味着操作系统将反复尝试调度作业,直到它完成参数为false。这样,您不必再为下一项工作等待一个小时,并且可以更快地再次尝试。 无论此参数是true 还是false,都会根据初始周期设置执行下一个作业。

    也就是说,这种重复的调度会消耗大量电量,并且可能会导致许多冗余调用。在大多数情况下,可以通过将参数设置为false 来“删除”当前作业实例。下一个计划作业仍将根据您的初始参数执行。


    至于您的代码 sn-p,我不确定为什么它没有再次执行。代码看起来是正确的,只要确保你在整个期间而不是半小时后检查。还要考虑打盹模式等特殊情况,它会阻止几乎所有后台服务执行,并在以后自行重新安排它们。

    【讨论】:

      猜你喜欢
      • 2021-05-22
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      相关资源
      最近更新 更多