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
会自动处理取消。
我正在使用 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
会自动处理取消。