android - Kotlin 协程 : RxJava-like subscribe to running job/Check if coroutine is running

标签 android kotlin kotlinx.coroutines

我有以下设置(简化):

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

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

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

有没有办法通过协程实现这一点?

最佳答案

解决方法如下:

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

关于android - Kotlin 协程 : RxJava-like subscribe to running job/Check if coroutine is running,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49996234/

相关文章:

Android复选框状态检查

java - Android - 将 TCP 客户端转换为 UDP 客户端

kotlin - 使用 Kotlin Channel 是什么意思?

Android:布局不适合屏幕,尽管它应该

android - 加载位图时出现内存不足错误

android - Flutter Kotlin从广播接收器获取数据

kotlin - ZonedDateTime 的比较运算符与比较方法

kotlin - 将 Kotlin 的 KClass 转换为 Java 中的常规 Class

android - 如何在不阻塞 UI 的情况下将 AsyncLayoutInflater 与 Kotlin 协程一起使用

android - 在 retrofit 认证器中使用协程