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中。
我试图通过这种方式从 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中。