对于 Kotlin 用户,WorkManager 为协程提供了一流的支持。如要开始使用,请将 work-runtime-ktx
包含到您的 gradle 文件中。不要扩展 Worker
,而应扩展 CoroutineWorker
,后者包含 doWork()
的挂起版本。例如,如果要构建简单的 CoroutineWorker
来执行某些网络操作,您需要执行以下操作:
class CoroutineDownloadWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result = {
val data = downloadSynchronously("https://www.google.com")
saveData(data)
Result.success()
}
}
请注意,CoroutineWorker.doWork()
是一个“挂起”函数。此代码不同于 Worker
,不会在 Configuration
中指定的 Executor
中运行,而是默认为 Dispatchers.Default
。您可以提供自己的 CoroutineContext
来自定义这个行为。在上面的示例中,您可能希望在 Dispatchers.IO
上完成此操作,如下所示:
class CoroutineDownloadWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
withContext(Dispatchers.IO) {
val data = downloadSynchronously("https://www.google.com")
saveData(data)
return Result.success()
}
}
}
CoroutineWorker
通过取消协程并传播取消信号来自动处理停工情况。您无需执行任何特殊操作来处理停工情况。