Google 致力于为黑人社区推动种族平等。查看具体举措

用 CoroutineWorker 处理线程

对于 Kotlin 用户,WorkManager 为协程提供了一流的支持。要开始使用,请将 work-runtime-ktx 包含到您的 gradle 文件中。不要扩展 Worker,而应扩展 CoroutineWorker,后者使用的 API 略有不同。例如,如果要构建简单的 CoroutineWorker 来执行某些网络操作,则需要执行以下操作:

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

请注意,CoroutineWorker.doWork() 是一个“挂起”函数。不同于 Worker,此代码不会在 Configuration 中指定的 Executor 上运行,而是默认为 Dispatchers.Default。您可以提供自己的 CoroutineContext 来自定义这个行为。在上面的示例中,您可能希望在 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 通过取消协程并传播取消信号来自动处理停工情况。您无需执行任何特殊操作来处理停工情况