5

参考: Android WorkManager api 用于后台运行日常任务

它使用WorkManager.enqueueUniquePeriodicWork来确保PeriodicWorkRequest不会被多次创建。

示例代码:

val work = PeriodicWorkRequestBuilder<SyncWork>(15,TimeUnit.MINUTES).build()

WorkManager.getInstance().enqueueUniquePeriodicWork("TaskTag",
                                       ExistingPeriodicWorkPolicy.KEEP, work);

但是,我发现ExistingPeriodicWorkPolicy它有两个选项可以使用。ExistingPeriodicWorkPolicy.KEEPExistingPeriodicWorkPolicy.REPLACE

我尝试实现它并运行代码,但它确实显示出任何差异,而且看起来它们的行为方式相同。

我的不确定性:

表现与有何ExistingPeriodicWorkPolicy.KEEP不同?ExistingPeriodicWorkPolicy.REPLACE

4

2 回答 2

6

在您的示例中,您将要排队一个新的工作请求(又名工作人员)。如果您之前在运行时完成了此操作,则该工作人员已经存在状态 ENQUEUED。

KEEP:如果以前的工作人员存在,则您的新尝试将被忽略,否则您的新工作人员将入队。

REPLACE:如果先前的工作人员存在,则将其取消,从而导致其处于 CANCELED 状态。然后,否则,您的新工作人员将排队。

所以,如果你确定你的新工人和前一个工人一样(比如约束没有改变),那么 KEEP 应该是安全的,否则 REPLACE 可能是更好的选择。

于 2018-08-01T11:23:15.490 回答
3

KEEP:如果存在具有相同唯一名称的现有待处理工作,则什么也不做。

替换:如果存在具有相同唯一名称的现有待处理工作,请取消并删除它。

于 2018-08-01T07:58:52.113 回答