【问题标题】:Any way to have initial delay for PeriodicWorkRequestPeriodicWorkRequest 初始延迟的任何方式
【发布时间】:2018-12-16 05:02:00
【问题描述】:

对于OneTimeWorkRequest,我们可以使用setInitialDelay 来指定初始延迟。

但是,PeriodicWorkRequest 没有这样的功能。

有什么可靠的方法可以做到吗?

一种不太可靠的方法是让一个延迟的OneTimeWorkRequest 工作人员设置PeriodicWorkRequest。但是,这很麻烦,并且有可能导致OneTimeWorkRequest 失败并且无法安装PeriodicWorkRequest

【问题讨论】:

  • 你是如何解决这个问题的?

标签: android android-workmanager


【解决方案1】:

由于系统运行您的工作,您无法控制它运行的确切时间..

创建工作执行延迟的最佳选择是使用此 PeriodicWorkRequest.Builder 并提供 flexInterval 作为第四个参数:

PeriodicWorkRequest build = new PeriodicWorkRequest.Builder(
     SyncJobWorker.class, 
     REPEAT_INTERVAL, // repeatInterval
     TimeUnit.MILLISECONDS, // repeatIntervalTimeUnit
     FLEX_INTERVAL, // flexInterval
     TimeUnit.MILLISECONDS) // flexIntervalTimeUnit
       .build();

文档参考:https://developer.android.com/reference/androidx/work/PeriodicWorkRequest.Builder#periodicworkrequestbuilder_2

创建一个 PeriodicWorkRequest 以在每个间隔周期的弹性周期内定期运行一次。见下图。弹性周期从intervalMillis - flexMillis 开始到间隔结束。 intervalMillis 必须大于或等于 PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS 并且 flexMillis 必须大于或等于 PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS。

【讨论】:

  • 当心。同样来自文档:Note that flex intervals are ignored for certain OS versions (in particular, API 23). 另请注意,最小弹性时间 PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS 为 5 分钟。
【解决方案2】:

由于androidx.work:work-*:2.1.0PeriodicWorkRequests 支持初始延迟。您可以使用PeriodicWorkRequest.Builder 上的setInitialDelay 方法来设置初始延迟。

有关官方文档,请参阅link

【讨论】:

  • setInitialDelay 工作很奇怪。当我设置 15 分钟的启动时间和 1 分钟的初始延迟时,工作人员会在 16 分钟后启动。我认为它会立即(如OneTimeWorkRequest),但在 1 分钟后(而不是 16 分钟后)。随后的启动将是每 15 分钟一次。
  • @proninyaroslav 看起来它在间隔结束时执行,而不是在开始时执行
猜你喜欢
  • 2020-05-10
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 2017-11-11
相关资源
最近更新 更多