【问题标题】:How long does WorkManager persist failed jobs?WorkManager 将失败的作业保留多长时间?
【发布时间】:2019-11-07 04:28:34
【问题描述】:

我有一个场景,我想重试最近失败的作业,但 workmanager 会返回所有失败的作业。有没有办法删除旧工作?

【问题讨论】:

    标签: android androidx android-workmanager


    【解决方案1】:

    对于OneTimeWorkRequest,FAILURE 是最终状态。它不会被重新执行。对于PeriodicWorkRequest,情况有所不同。检查此博客:

    this video 也涵盖了这个。

    回到你的问题:

    有没有办法删除旧作业?

    是的!

    使用WorkManager#pruneWork() 删除处于最终状态(成功、失败和取消)的作业。正如您从文档中看到的那样,必须谨慎使用此方法。

    请记住,这会删除所有处于失败状态的作业。删除旧作业的一种方法是减少 WorkRequest 保留在 WorkManager 的数据库中的时间,在您构建它们时设置自定义保留值。为此使用WorkRequest#keepResultsForAtLeast(long duration, TimeUnit timeUnit)

    【讨论】:

      【解决方案2】:

      肯定有办法取消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() 的调用。覆盖此方法以处理任何潜在的清理。有关详细信息,请参阅停止正在运行的工作人员。

      【讨论】:

      • OneTimeWorkRequest 返回失败,WorkManager 永远不会自动重启,
      猜你喜欢
      • 1970-01-01
      • 2015-10-31
      • 2011-02-11
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多