我正在尝试启动一个工作请求以从远程源获取数据,然后将数据插入 Room 数据库。
工作人员负责获取数据并将数据插入 Room 数据库。
在存储库中,我为 WorkManager 排队了一个工作请求:
// ...
private val workManager = WorkManager.getInstance(context)
private val imageDao = database.imageDao()
suspend fun getImages(): List<Images> {
// ...
workManager.apply {
enqueueUniqueWork(
uniqueWorkName,
ExistingWorkPolicy.KEEP,
OneTimeWorkRequestBuilder<FetchImagesWorker>()
.setConstraints(constraints)
.build()
)
.await()
}
return imageDao.getAll()
}
工作请求运行成功。但是,该函数在工作请求返回
return imageDao.getAll()
.之前尝试在行
Success
中访问Room 数据库
我在
这个例子的独特作品上使用
await()
。
但是,有没有
await()
似乎并没有什么区别。此外,Worker
班级的工作在 withContext(Dispatchers.IO)
块内,但同样,它是否存在似乎没有什么不同。
关于如何在函数从 Room 数据库返回结果之前等待工作请求完成的任何想法?
提前致谢。
您的代码的问题是将工作请求入队的调用是异步的,这意味着它不会阻塞线程并将继续执行下一行代码。这就是为什么您遇到在工作请求完成之前尝试访问 Room 数据库的问题。
要在访问 Room 数据库之前等待工作请求完成,您需要使用 Worker 在完成任务时可以更新的 LiveData 对象。然后,您可以从您的存储库或 ViewModel 观察这个 LiveData 对象,并且仅当 LiveData 对象被工作请求的结果更新时才返回 Room 数据库结果。