我有以下设置(简化):
- 网络管理器(从后端获取数据)
- 存储库(处理数据并转发到 ui)
我正在寻找一种使用协程执行以下操作的方法:
- 在到达目标屏幕之前,我已经开始预取数据,同时导航到另一个屏幕。
- 到达目标屏幕时,我想检查任务是否仍在运行,如果是,则“订阅”或等待结果,而不是开始新的冗余网络作业。
有没有办法用协程来实现这一点?
我有以下设置(简化):
我正在寻找一种使用协程执行以下操作的方法:
有没有办法用协程来实现这一点?
解决方案如下:
当应用程序启动时,它会触发通过存储库预取一些数据。存储库保存对正在运行的协程的作业引用。当到达目标屏幕时,将调用存储库中的另一个方法。在此方法中,应用程序现在只需检查作业是否仍处于活动状态,如果是,则调用 job.join() 以等待执行完成,然后再继续。
这是问题的简化。请只关注问题的解决方案: - 启动协程, - 检查协程是否仍在运行, - 如果是,则等待协程完成后再执行其他逻辑
在存储库中,它如下所示:
class Repository(private val networkManager: NetworkManager) {
private var allObjectsJob: Job? = null
fun getAllObjects(forceReload: Boolean = false) {
allObjectsJob = launch {
try {
val objects = networkManager.getAllObjects().await().filterNotNull()
// e.g. put all objects in map
} catch (e: HttpException) {
// error handling
}
}
}
fun getObject(id: String) {
launch {
if (allObjectsJob != null && allObjectsJob!!.isActive) {
allObjectsJob!!.join()
}
// e.g. get object from map
}
}
}
协程很热门,因此您可以通过在后台或 UI 上下文中启动任务来推动数据:
job = launch(CommonPool) {
val data = getDataFromBackend().await()
val result = repository.handleData(data).await()
launch(UI) {
// update the UI here based on data or result
}
}