Para los usuarios de Kotlin, WorkManager proporciona compatibilidad de primera clase con corrutinas. Para comenzar, incluye work-runtime-ktx
en tu archivo de Gradle. En lugar de extender Worker
, deberías extender CoroutineWorker
, que tiene una versión con suspensión de doWork()
. Por ejemplo, si quieres compilar un CoroutineWorker
simple para realizar algunas operaciones de red, debes hacer lo siguiente:
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()
}
}
Ten en cuenta que CoroutineWorker.doWork()
es una función de suspensión. A diferencia de Worker
, este código no se ejecuta en el Executor
especificado en tu Configuration
. En cambio, la opción predeterminada es Dispatchers.Default
. Puedes personalizarlo si proporcionas tu propio CoroutineContext
. En el ejemplo anterior, es probable que desees realizar el siguiente trabajo en 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
controla las detenciones automáticamente mediante la cancelación de la corrutina y la propagación de los indicadores de cancelación. No es necesario que hagas nada especial para controlar las interrupciones de trabajo.