Android WorkManager - CoroutineWorker:不推荐重写 coroutineContext

Spi*_*pau 6 android android-architecture-components android-jetpack android-workmanager

当用户再次上线时,我使用WorkManager版本 2.2.0 来启动 Coroutines API 调用。

在 Google 的示例中,如果我想将 CoroutineWorker 的 Thread 从默认值 ( Dispatchers.Default) 更改为Dispatchers.IO,那么我只需覆盖val coroutineContext例如:

class CoroutineDownloadWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {

    override val coroutineContext = Dispatchers.IO

    override suspend fun doWork(): Result = coroutineScope {
         // do some work here and return a Result
    }
}
Run Code Online (Sandbox Code Playgroud)

但是 Android Studio 和文档告诉我,coroutineContext不推荐使用覆盖:

在此处输入图片说明

我错过了什么,我该如何解决这个问题?

Vit*_*lyi 6

您的问题的答案在发行说明中:

弃用 CoroutineWorker.coroutineContext。该字段被错误地输入为 CoroutineDispatcher;您应该不再需要它,因为您可以自己在挂起函数的主体中转到所需的 coroutineContext。

https://developer.android.com/jetpack/androidx/releases/work#2.1.0-alpha01

来源中也有答案:

/**
 * The coroutine context on which [doWork] will run. By default, this is [Dispatchers.Default].
 */
@Deprecated(message = "use withContext(...) inside doWork() instead.")
open val coroutineContext = Dispatchers.Default
Run Code Online (Sandbox Code Playgroud)

因此,您可以执行以下操作:

override suspend fun doWork(): Result = withContext(Dispatchers.IO) { ...