Android 工作管理器 - ExistingPeriodicWorkPolicy.KEEP 和 .Replace 之间的区别
Android Work Manager - Difference between ExistingPeriodicWorkPolicy.KEEP and .Replace
参考: Android WorkManager api for running daily task in Background
它使用 WorkManager.enqueueUniquePeriodicWork
来确保不会多次创建 PeriodicWorkRequest。
示例代码:
val work = PeriodicWorkRequestBuilder<SyncWork>(15,TimeUnit.MINUTES).build()
WorkManager.getInstance().enqueueUniquePeriodicWork("TaskTag",
ExistingPeriodicWorkPolicy.KEEP, work);
不过,我发现ExistingPeriodicWorkPolicy
有2个选项ExistingPeriodicWorkPolicy.KEEP
和ExistingPeriodicWorkPolicy.REPLACE
可以用。
我尝试实现它和 运行 代码,但它确实显示出任何差异,而且它们的行为方式似乎相同。
我的不确定性:
ExistingPeriodicWorkPolicy.KEEP
与 ExistingPeriodicWorkPolicy.REPLACE
的表现有何不同?
KEEP:如果存在具有相同唯一名称的待处理工作,则什么也不做。
REPLACE: 如果存在具有相同唯一名称的待处理工作,取消并删除它。
在您的示例中,您将要排队一个新的工作请求 (a.k.a.worker)。
如果您之前在运行时执行过此操作,则此 worker 已经存在且状态为 ENQUEUED。
KEEP:如果之前的 worker 存在,您的新尝试将被忽略,否则您的新 worker 将被排队。
REPLACE:如果之前的 worker 存在,它将被取消,导致它的状态为 CANCELED。然后,否则,您的新工人已入队。
所以,如果你确定你的新工人和以前的工人一样(比如约束没有改变),那么 KEEP 应该是安全的,否则 REPLACE 可能是更好的选择。
参考: Android WorkManager api for running daily task in Background
它使用 WorkManager.enqueueUniquePeriodicWork
来确保不会多次创建 PeriodicWorkRequest。
示例代码:
val work = PeriodicWorkRequestBuilder<SyncWork>(15,TimeUnit.MINUTES).build()
WorkManager.getInstance().enqueueUniquePeriodicWork("TaskTag",
ExistingPeriodicWorkPolicy.KEEP, work);
不过,我发现ExistingPeriodicWorkPolicy
有2个选项ExistingPeriodicWorkPolicy.KEEP
和ExistingPeriodicWorkPolicy.REPLACE
可以用。
我尝试实现它和 运行 代码,但它确实显示出任何差异,而且它们的行为方式似乎相同。
我的不确定性:
ExistingPeriodicWorkPolicy.KEEP
与 ExistingPeriodicWorkPolicy.REPLACE
的表现有何不同?
KEEP:如果存在具有相同唯一名称的待处理工作,则什么也不做。
REPLACE: 如果存在具有相同唯一名称的待处理工作,取消并删除它。
在您的示例中,您将要排队一个新的工作请求 (a.k.a.worker)。 如果您之前在运行时执行过此操作,则此 worker 已经存在且状态为 ENQUEUED。
KEEP:如果之前的 worker 存在,您的新尝试将被忽略,否则您的新 worker 将被排队。
REPLACE:如果之前的 worker 存在,它将被取消,导致它的状态为 CANCELED。然后,否则,您的新工人已入队。
所以,如果你确定你的新工人和以前的工人一样(比如约束没有改变),那么 KEEP 应该是安全的,否则 REPLACE 可能是更好的选择。