在我们应用程序的先前迭代中,我们使用 WorkManager 实现了一个周期性任务,如下所示:
WorkManager.getInstance(context).enqueue(
new PeriodicWorkRequest.Builder(OurClassName.class, 8, TimeUnit.HOURS)
.setConstraints(constraints)
.setInputData(OurClassName.getParameterBundle())
.build()
);
此代码片段安排了每 8 小时执行一次的作业。
但是,我们遇到了一个问题,即这些任务无法取消,因为它们没有分配唯一的“名称”或“标签”。
让事情变得更复杂的是,由于一个错误,每次应用程序启动时都会执行此调度代码,导致相同的调度作业大量累积。
尽管尝试使用
WorkManager
和 JobScheduler
的 cancelAll
方法作为广泛的解决方案,但工作仍然存在。
我们如何有效地取消这些定期计划的任务,特别是考虑到它们缺乏唯一标识符?
我们遇到了一个问题,即这些任务无法取消,因为它们没有分配唯一的“名称”或“标签”。
由
WorkRequest
函数创建的 .build()
可用于获取 id
以通过 WorkManager 实例管理其操作。
示例:
val periodicWorker = new PeriodicWorkRequest.Builder(OurClassName.class, 8, TimeUnit.HOURS)
.setConstraints(constraints)
.setInputData(OurClassName.getParameterBundle())
.build()
val workId = periodicWorker.id;
让事情变得更复杂的是,由于一个错误,每次应用程序启动时都会执行此调度代码,导致相同的调度作业大量累积。
由于使用了
enqueue
,这是预期的。使用 enqueueUniquePeriodicWork
将按预期工作。
假设您需要取消所有之前的
WorkRequest
(比如在新的应用程序更新时),如果您有 ID,则可以使用 - WorkManager.getInstance(context).cancelAllWork()
或 WorkManager.getInstance(context).cancelAllWorkById(workId)
,然后通过 enqueueUniquePeriodicWork
注册新的 WorkRequest。
文档免责声明:
取消所有未完成的工作。使用此方法时要格外小心!通过调用它,您可能会影响代码库中的其他模块或库。强烈建议您使用您可以使用的其他取消方法之一。