【问题标题】:CoroutineWorker crashing when using WorkManager#enqueueUniqueWork but not when using WorkManager#enqueueCoroutineWorker 在使用 WorkManager#enqueueUniqueWork 时崩溃,但在使用 WorkManager#enqueue 时没有
【发布时间】:2020-02-28 02:09:55
【问题描述】:

我正在使用 Android Jetpacks 的 WorkManager。我定义了一个相当标准的CoroutineWorker 进行网络和数据库处理,但我不能使用WorkManager#enqueueUniqueWork 唯一地将它排入队列。

我总是得到一个

Work [ id=****, tags={ **** } ] was cancelled

但如果我使用WorkManager#enqueue,同样的工作请求也能完美运行。

我在这里有点不知所措。我试图在其他地方寻找类似的问题,但我的 DDG-fu 失败了。我担心这与协程问题有关,但我对他们感到不舒服,不知道在哪里搜索...

【问题讨论】:

  • 当您致电enqueueUniqueWork 时,您使用的是什么ExistingWorkPolicy
  • 它是ExistingWorkPolicy.REPLACE

标签: android android-jetpack android-workmanager


【解决方案1】:

这是意料之中的。根据ExistingWorkPolicy.REPLACE Javadoc

如果存在具有相同唯一名称的现有待处理(未完成)工作,请取消并将其删除。然后,插入新指定的作品。

因此,任何使用相同唯一名称的作品都将被取消。这适用于任何类型的工作 - Worker 将获得对 onStopped() 的回调,这表明它需要合作取消自身。

协程默认支持取消,因此您的 CoroutineWorker 会自动处理取消。

【讨论】:

  • 好的,但是...为什么我刚刚入队的工作会在入队后自行取消?那是我的问题。我希望任何以前排队的工作请求都会被取消,但为什么我想排队以替换它们的请求会被取消?
  • 新入队的工作没有被取消,您可以通过查看您传递给enqueueUniqueWork() 的工作的getId() 并将其与日志记录进行比较来确认。如果您想了解更多关于正在发生的事情的信息,您可能还会发现 enable debug logging in WorkManager 对您有所帮助。
  • 您的意思是实际上testing workers 还是只是运行您的应用程序?您的问题中没有包含任何代码,说明您何时/何地拨打enqueueUniqueWork,也没有确认ID 匹配。它们匹配吗?
  • 好吧,你是对的,确实。我有两份工作一个接一个地跑。我之前做过检查,以确保另一项工作尚未运行,但代码并不好。对噪音感到抱歉。我一定很累。谢谢你帮助我。
  • 编辑:好的,再精确一些。冲突的多种原因:-首先,检查工作请求是否尚未进行的非工作代码,-第二:完成活动似乎取消了它排队的工作请求。您是否知道是否有办法在活动完成的整个过程中保持请求(例如,启动屏幕?)
猜你喜欢
  • 1970-01-01
  • 2022-07-03
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2018-10-26
相关资源
最近更新 更多