【问题标题】:How to wait for all the async to finish?如何等待所有异步完成?
【发布时间】:2020-02-22 09:37:07
【问题描述】:

我有一个我想要执行的请求列表,我想等待所有请求完成以便继续。我正在使用带有重复和异步的 kotlin 协程,如下所示。

viewModelScope.launch(Dispatchers.IO) {
            repeat(serverAccountList.size) { 
                async { 
                    createHelloRequest(it)  // suspend function
                }
            }



            withContext(Dispatchers.Main) {
                _isLoading.value = false
            }
        }

我怎样才能加入他们,以便我可以在 Main Dispatcher 中继续我的代码?

【问题讨论】:

    标签: android kotlin async-await kotlin-coroutines


    【解决方案1】:

    不要使用Dispatchers.IO 调用可挂起(非阻塞)函数。您的所有代码都可以保留在 Main 调度程序上。此外,根据需要使用 coroutineScopelaunch 的子任务,Kotlin 将确保在 coroutineScope 调用完成之前完成所有子任务。

    所有放在一起,你的代码应该是这样的:

    viewModelScope.launch {
        _isLoading.value = true
        coroutineScope {
            repeat(serverAccountList.size) {
                launch { createHelloRequest(it) }
            }
        }
        _isLoading.value = false
    }
    

    【讨论】:

    • 为什么不应该调用 IO Dispatcher 来实现可挂起的功能?
    • 真正的问题是,为什么应该使用它。使用包含在可挂起函数中的异步网络 API 的主要目的是避免重量级的本地线程,它们只会等待阻塞操作完成。 IO 调度程序只是为那些被阻塞的网络 API 卡住的不幸的人提供一种解决方法。
    【解决方案2】:

    您需要为您的异步调用 await - 例如

    ...
    
    val stuff = async {...}
    stuff.await()
    ...
    

    【讨论】:

      【解决方案3】:
      
          val jobs = mutableListOf<Job>()
      
          viewModelScope.launch(Dispatchers.IO) {
              repeat(serverAccountList.size) { 
                  // save all job handles to mutable variable
                  jobs += async { createHelloRequest(it) }
              }
      
              // await on all jobs
              jobs.awaitAll()   
      
              withContext(Dispatchers.Main) {
                  _isLoading.value = false
              }
          }
      
      

      【讨论】:

        猜你喜欢
        • 2011-10-04
        • 1970-01-01
        • 2014-04-03
        • 2016-07-07
        • 2016-03-16
        • 1970-01-01
        • 2018-07-17
        • 2020-10-04
        • 1970-01-01
        相关资源
        最近更新 更多