Cómo ejecutar subprocesos en CoroutineWorker

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)
        return 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.