Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

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 la clase Worker, deberías extender CoroutineWorker, que tiene una API levemente distinta. 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 las interrupciones de trabajo.