WorkManager:Awaiting work 好像不是等待工作完成?

问题描述 投票:0回答:1

我正在尝试启动一个工作请求以从远程源获取数据,然后将数据插入 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 数据库返回结果之前等待工作请求完成的任何想法?

提前致谢。

android kotlin kotlin-coroutines android-workmanager
1个回答
0
投票

您的代码的问题是将工作请求入队的调用是异步的,这意味着它不会阻塞线程并将继续执行下一行代码。这就是为什么您遇到在工作请求完成之前尝试访问 Room 数据库的问题。

要在访问 Room 数据库之前等待工作请求完成,您需要使用 Worker 在完成任务时可以更新的 LiveData 对象。然后,您可以从您的存储库或 ViewModel 观察这个 LiveData 对象,并且仅当 LiveData 对象被工作请求的结果更新时才返回 Room 数据库结果。

© www.soinside.com 2019 - 2024. All rights reserved.