有没有办法为PeriodicWorkRequest设置初始延迟?

13

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

然而,对于PeriodicWorkRequest,没有这样的设施。

有可靠的方法来实现吗?

其中一种不太可靠的方法是,使用延迟的OneTimeWorkRequest工作者来设置PeriodicWorkRequest。 但是,这相当繁琐,并且会产生一个可能性,即OneTimeWorkRequest可能会失败,无法安装PeriodicWorkRequest


你是怎么修复这个问题的? - Aram
2个回答

5
自从 androidx.work:work-*:2.1.0 版本以来,PeriodicWorkRequests 支持初始延迟。 您可以在 PeriodicWorkRequest.Builder 上使用 setInitialDelay 方法来设置初始延迟。
有关官方文档,请参见 链接

1
setInitialDelay 的工作方式很奇怪。当我设置了启动时间为15分钟和初始延迟为1分钟时,工作程序会在16分钟后开始运行。我原以为它会立即启动(就像 OneTimeWorkRequest 一样),但实际上是在1分钟后启动的(而不是16分钟)。之后的启动将每隔15分钟进行一次。 - proninyaroslav
1
@proninyaroslav 看起来它在时间间隔结束时执行,而不是在开始时执行。 - Vadim Kotov

5
由于系统运行您的工作,您无法控制它运行的确切时间。
创建工作执行延迟的最佳选择是使用此PeriodicWorkRequest.Builder并提供flexInterval作为第4个参数。
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。

enter image description here


2
请注意,文档中提到:“请注意,在某些操作系统版本(特别是API 23)中将忽略灵活间隔。”此外,请注意最小灵活时间PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS为5分钟。 - Chris Knight

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