唯一工作

唯一工作是一个概念性非常强的术语,可确保一次只有一个具有特定名称的工作链。id 不同的是,唯一名称是人类可读的,由开发者指定,而不是由 WorkManager 自动生成。与标记不同,唯一名称仅与“一个”工作链关联。

您可以通过调用 WorkManager.enqueueUniqueWork(String, ExistingWorkPolicy, OneTimeWorkRequest)WorkManager.enqueueUniquePeriodicWork(String, ExistingPeriodicWorkPolicy, PeriodicWorkRequest) 创建唯一工作序列。第一个参数是唯一名称 - 这是我们用来标识 WorkRequest 的键。第二个参数是冲突解决策略,它指定了如果已经存在一个具有该唯一名称的未完成工作链,WorkManager 应该如何处理:

  • 取消现有工作链,并将其 REPLACE 为新工作链。
  • KEEP 现有序列并忽略您的新请求。
  • 将新序列 APPEND 到现有序列,在现有序列的最后一个任务完成后运行新序列的第一个任务。您不能将 APPENDPeriodicWorkRequest 一起使用。

当您有不能够多次排队的任务时,唯一工作将非常有用。例如,如果您的应用需要将其数据同步到网络,您可能需要对一个名为“sync”的序列进行排队,并指定当已经存在具有该名称的序列时,应该忽略新的任务。当您需要逐步构建一个长任务链时,也可以利用唯一工作序列。例如,照片编辑应用可能允许用户撤消一长串操作。其中的每一项撤消操作可能都需要一些时间来完成,但必须按正确的顺序执行。在这种情况下,应用可以创建一个“撤消”链,并根据需要将每个撤消操作附加到该链上。

最后,如果您需要创建一个唯一工作链,可以使用 WorkManager.beginUniqueWork(String, ExistingWorkPolicy, OneTimeWorkRequest) 代替 beginWith()