【发布时间】:2019-11-07 04:28:34
【问题描述】:
我有一个场景,我想重试最近失败的作业,但 workmanager 会返回所有失败的作业。有没有办法删除旧工作?
【问题讨论】:
标签: android androidx android-workmanager
我有一个场景,我想重试最近失败的作业,但 workmanager 会返回所有失败的作业。有没有办法删除旧工作?
【问题讨论】:
标签: android androidx android-workmanager
对于OneTimeWorkRequest,FAILURE 是最终状态。它不会被重新执行。对于PeriodicWorkRequest,情况有所不同。检查此博客:
this video 也涵盖了这个。
回到你的问题:
有没有办法删除旧作业?
是的!
使用WorkManager#pruneWork() 删除处于最终状态(成功、失败和取消)的作业。正如您从文档中看到的那样,必须谨慎使用此方法。
请记住,这会删除所有处于失败状态的作业。删除旧作业的一种方法是减少 WorkRequest 保留在 WorkManager 的数据库中的时间,在您构建它们时设置自定义保留值。为此使用WorkRequest#keepResultsForAtLeast(long duration, TimeUnit timeUnit)
【讨论】:
肯定有办法取消WorkManager的作品。
要取消来自WorkManager 的作品,您只需保存作品的 UUID。
而且你可以通过这段代码取消任何工作-
WorkManager.getInstance(context).cancelWorkById(UUID); [Deprecated]
编辑: 您可以像下面这样取消 - 取自 - https://developer.android.com/topic/libraries/architecture/workmanager/how-to/managing-work#cancelling
// by id
workManager.cancelWorkById(syncWorker.id);
// by name
workManager.cancelUniqueWork("sync");
// by tag
workManager.cancelAllWorkByTag("syncTag");
在后台,WorkManager 检查工作的状态。如果工作已经完成,则什么也不会发生。否则,工作的状态将更改为 CANCELED,以后将不会运行工作。任何依赖此工作的 WorkRequest 作业也将被取消。
Currently RUNNING work 收到对 ListenableWorker.onStopped() 的调用。覆盖此方法以处理任何潜在的清理。有关详细信息,请参阅停止正在运行的工作人员。
【讨论】: