Linhas de execução no CoroutineWorker

Para usuários do Kotlin, o WorkManager oferece compatibilidade de primeira classe com corrotinas. Para começar, inclua work-runtime-ktx no seu arquivo Gradle. Em vez de estender o Worker, estenda o CoroutineWorker, que tem uma API um pouco diferente. Por exemplo, se você quiser criar um CoroutineWorker simples para executar algumas operações de rede, faça o seguinte:

    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()
        }
    }
    

Observe que o CoroutineWorker.doWork() é uma função de suspensão. Diferentemente de Worker, esse código não é executado no Executor especificado na Configuration. Em vez disso, o padrão é Dispatchers.Default. Você pode personalizar isso fornecendo seu próprio CoroutineContext. No exemplo acima, você provavelmente faria esse trabalho em Dispatchers.IO, da seguinte maneira:

    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()
        }
    }
    

Os CoroutineWorkers processam as interrupções automaticamente, cancelando a corrotina e propagando os sinais de cancelamento. Você não precisa fazer nada especial para lidar com as interrupções de trabalho.