Kotlin Coroutines:类似RxJava订阅正在运行的作业/检查协同程序是否正在运行

时间:2018-04-24 07:54:01

标签: android kotlin kotlinx.coroutines

我有以下设置(简化):

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

我正在寻找一种方法来使用Coroutines执行以下操作:

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

有没有办法用Coroutines实现这个目标?

2 个答案:

答案 0 :(得分:1)

解决方案如下:

当应用程序启动时,它会触发通过存储库预取一些数据。 存储库包含对正在运行的协同程序的作业引用。 到达目标屏幕时,将调用存储库中的另一个方法。在这个方法中,app现在只是检查作业是否仍处于活动状态,如果是,则调用job.join()以等待执行完成后再继续。

这是问题的简化。请关注问题的解决方案: - 启动协同程序, - 检查协程是否仍在运行, - 如果是,请在执行其他逻辑之前等待协程完成

在存储库中,它看起来如下:

project_name

答案 1 :(得分:0)

协同程序很热,因此您可以通过在background或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
    }
}