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

Dmi*_*kov 3 android android-workmanager kotlin-coroutines

我试图通过这种方式从 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
}
Run Code Online (Sandbox Code Playgroud)

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

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

也许我做错了什么?

Val*_*kov 5

您想要实现的目标看起来像是立即任务,而专为延迟任务WorkManager而设计,请参阅后台处理指南以获取有关差异的更多详细信息。

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

因此,如果这是一个即时任务,您可以使用协程来执行它,这是推荐的方式。如果是延迟任务,则使用WorkManager结果处理逻辑并将其移至工作线程中。