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 API levemente diferente. 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 = coroutineScope {
            val jobs = (0 until 100).map {
                async {
                    downloadSynchronously("https://www.google.com")
                }
            }

            // awaitAll will throw an exception if a download fails, which CoroutineWorker will treat as a failure
            jobs.awaitAll()
            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 val coroutineContext = Dispatchers.IO

        override suspend fun doWork(): Result = coroutineScope {
            val jobs = (0 until 100).map {
                async {
                    downloadSynchronously("https://www.google.com")
                }
            }

            // awaitAll will throw an exception if a download fails, which CoroutineWorker will treat as a failure
            jobs.awaitAll()
            Result.success()
        }
    }
    

CoroutineWorker controla las detenciones automáticamente mediante la cancelación de la corrutina y la propagación de las señales de cancelación. No es necesario que hagas nada especial para controlar los paros laborales.