CoroutineWorker 在使用 WorkManager#enqueueUniqueWork 时崩溃,但在使用 WorkManager#enqueue 时不会崩溃

CoroutineWorker crashing when using WorkManager#enqueueUniqueWork but not when using WorkManager#enqueue

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

我总是以

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

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

我在这里有点无能为力。我试图在别处寻找类似的问题,但我的 DDG-fu 却让我失望了。我担心这与协程问题有关,但我对他们不太满意,不知道在哪里搜索...

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

If there is existing pending (uncompleted) work with the same unique name, cancel and delete it. Then, insert the newly-specified work.

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

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