在 Android WorkManager 中取消未命名、非唯一的定期工作请求

问题描述 投票:0回答:1

在我们应用程序的先前迭代中,我们使用 WorkManager 实现了一个周期性任务,如下所示:

WorkManager.getInstance(context).enqueue(
    new PeriodicWorkRequest.Builder(OurClassName.class, 8, TimeUnit.HOURS)
        .setConstraints(constraints)
        .setInputData(OurClassName.getParameterBundle())
        .build()
);

此代码片段安排了每 8 小时执行一次的作业。

但是,我们遇到了一个问题,即这些任务无法取消,因为它们没有分配唯一的“名称”或“标签”。

让事情变得更复杂的是,由于一个错误,每次应用程序启动时都会执行此调度代码,导致相同的调度作业大量累积。

尽管尝试使用

WorkManager
JobScheduler
cancelAll
方法作为广泛的解决方案,但工作仍然存在。

我们如何有效地取消这些定期计划的任务,特别是考虑到它们缺乏唯一标识符?

android android-workmanager
1个回答
0
投票

我们遇到了一个问题,即这些任务无法取消,因为它们没有分配唯一的“名称”或“标签”。

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。

文档免责声明:

取消所有未完成的工作。使用此方法时要格外小心!通过调用它,您可能会影响代码库中的其他模块或库。强烈建议您使用您可以使用的其他取消方法之一。

© www.soinside.com 2019 - 2024. All rights reserved.