Android 带有协程上下文的 WorkManager 无法在同步模式下工作

Android WorkManager with coroutines context did not work in sync mode

我试图通过这种方式从 WorkManager 的挂起函数中获取结果

suspend fun uploadLogs(filePath: String): String {
    val request = createRequest(createInputLogsData(filePath))
    workManager.enqueue(request).await()
    val url = workManager.getWorkInfoById(request.id).await().outputData.getString(KEY_URL)
    return url
}

但看起来 await() 函数不起作用。调用 await() 之后,请求的状态仍然是 ENQUEUED。

我需要在此协程上下文中从 WorkManager 同步获取结果。

也许我做错了什么?

我没有用 workManager 尝试过,但这通常适用于我的 API 调用。

suspend fun uploadLogs(filePath: String) = withContext(Dispatchers.IO){
    val request = createRequest(createInputLogsData(filePath))
    workManager.enqueue(request).await()
    workManager.getWorkInfoById(request.id).await().outputData.getString(KEY_URL) 
}

请尝试一下,让我知道发生了什么。

您要实现的目标看起来像 immediate task while WorkManager is designed for deferred tasks, see background processing guide 以了解有关差异的更多详细信息。

WorkManager 不保证请求会立即执行。实际上,该请求可以在您的应用程序终止时甚至在设备重新启动后执行。无法等待请求完成。 WorkManager.enqueue() 方法不允许您等待请求结果,它只等待 enqueue 操作完成。

因此,如果它是一项即时任务,您可以使用协程来执行它,那就是 recommended way。如果是延迟任务,使用WorkManager并将结果处理逻辑移动到worker中。