2

我有以下设置(简化):

  • 网络管理器(从后端获取数据)
  • 存储库(处理数据并转发到 ui)

我正在寻找一种使用协程执行以下操作的方法:

  • 在到达目标屏幕之前,我已经开始预取数据,同时导航到另一个屏幕。
  • 到达目标屏幕时,我想检查任务是否仍在运行,如果是,则“订阅”或等待结果,而不是开始新的冗余网络作业。

有没有办法用协程来实现这一点?

4

2 回答 2

1

解决方案如下:

当应用程序启动时,它会触发通过存储库预取一些数据。存储库保存对正在运行的协程的作业引用。当到达目标屏幕时,将调用存储库中的另一个方法。在此方法中,应用程序现在只需检查作业是否仍处于活动状态,如果是,则调用 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
        }
    }
}
于 2018-04-24T13:19:32.033 回答
0

协程很热门,因此您可以通过在后台或 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
    }
}
于 2018-04-24T08:05:07.087 回答