Kotlin Coroutines - How to block to await/join all jobs?

后端 未结 3 1203
滥情空心
滥情空心 2021-01-18 07:17

I am new to Kotlin/Coroutines, so hopefully I am just missing something/don\'t fully understand how to structure my code for the problem I am trying to solve.

Essen

3条回答
  •  太阳男子
    2021-01-18 07:43

    runBlocking blocks current thread interruptibly until its completion. I guess it's not what you want. If I think wrong and you want to block the current thread than you can get rid of coroutine and just make network call in the current thread:

    val lstOfReturnData = mutableListOf()
    lstInputs.forEach {
        lstOfReturnData.add(networkCallToGetData(it))
    } 
    

    But if it is not your intent you can do the following:

    class Presenter(private val uiContext: CoroutineContext = Dispatchers.Main) 
        : CoroutineScope {
    
        // creating local scope for coroutines
        private var job: Job = Job()
        override val coroutineContext: CoroutineContext
            get() = uiContext + job
    
        // call this to cancel job when you don't need it anymore
        fun detach() {
            job.cancel()
        }
    
        fun processData(lstInputs: List) {
    
            launch {
                val deferredList = lstInputs.map { 
                    async(Dispatchers.IO) { networkCallToGetData(it) } // runs in parallel in background thread
                }
                val lstOfReturnData = deferredList.awaitAll() // waiting while all requests are finished without blocking the current thread
    
                // use lstOfReturnData in Main Thread, e.g. update UI
            }
        }
    }
    

提交回复
热议问题