Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Kotlin协程等待2个或更多不同的并发请求_Android_Kotlin_Kotlin Coroutines_Android Viewmodel - Fatal编程技术网

Android Kotlin协程等待2个或更多不同的并发请求

Android Kotlin协程等待2个或更多不同的并发请求,android,kotlin,kotlin-coroutines,android-viewmodel,Android,Kotlin,Kotlin Coroutines,Android Viewmodel,我正在使用kotlin协程从android中的服务器获取响应,并使用viewmodel。 问题是,我想得到两个不同的请求和响应来更新ui,但我想同时执行它们并等待它们完成。然后用收到的所有结果更新ui。 如果在每个请求之后使用async和await,它将逐个执行,并且不是并发的;如果使用请求映射和awaitAll(),我无法处理多个数据类型(数据类),因为两个请求的数据类型不同。 可能不止两个请求。 我能为这种情况做些什么 val job = viewModelScope.launch {

我正在使用kotlin协程从android中的服务器获取响应,并使用viewmodel。 问题是,我想得到两个不同的请求和响应来更新ui,但我想同时执行它们并等待它们完成。然后用收到的所有结果更新ui。 如果在每个请求之后使用async和await,它将逐个执行,并且不是并发的;如果使用请求映射和awaitAll(),我无法处理多个数据类型(数据类),因为两个请求的数据类型不同。 可能不止两个请求。 我能为这种情况做些什么

val job = viewModelScope.launch {

        val a = async { firstUseCase.execute() }.await()
        val b = async { secondUseCase.execute() }.await()
 }

您只需首先启动每个请求调用
async
,以获得并发行为,然后对所有请求执行
wait
,无论是逐个执行还是使用
waitall
一次性执行

个别地:

viewModelScope.launch {
    val a = async { firstUseCase.execute() }
    val b = async { secondUseCase.execute() }

    val resA = a.await()
    val resB = b.await()

    //Use results 'resA' and 'resB' here
}
或使用
等待全部

viewModelScope.launch {
    val a = async { firstUseCase.execute() }
    val b = async { secondUseCase.execute() }

    val (resA, resB) = awaitAll(a, b)

    //Use results 'resA' and 'resB' here
}

您可以使用异步协程生成器和并行映射来并行运行动态bg works,并暂停进一步的执行,直到所有结果都可用为止-

import kotlinx.coroutines.*

fun main() {
  runBlocking<Unit>
     {
       val smoothie = prepareSmoothie()
       println("prepareSmoothie | Smoothie prepared with: $smoothie")
     }
}

private suspend fun addIngredient(index: Int, item: String): String {
  println("prepareSmoothie | addIngredient: $item")
  delay(index.times(3_000).toLong())
  println("prepareSmoothie | addedIngredient: $item")
  return "$item"
}

private suspend fun prepareSmoothie(): List<String> {
  println("prepareSmoothie | Go On")
  println("++++++++++++++++++++++")
  return runBlocking {
      listOf("Fruits", "Grains", "Flavor boosters", "Ice").mapIndexed { index, item ->
        async {
          addIngredient(index, item)
        } .map { it.await() }
   }
}
  
Result:
  
prepareSmoothie | Go On
++++++++++++++++++++++
prepareSmoothie | addIngredient: Fruits
prepareSmoothie | addIngredient: Grains
prepareSmoothie | addIngredient: Flavor boosters
prepareSmoothie | addIngredient: Ice
++++++++++++++++++++++
prepareSmoothie | addedIngredient: Fruits
prepareSmoothie | addedIngredient: Grains
prepareSmoothie | addedIngredient: Flavor boosters
prepareSmoothie | addedIngredient: Ice
++++++++++++++++++++++
prepareSmoothie | Smoothie prepared with: [Fruits, Grains, Flavor boosters, Ice]
导入kotlinx.coroutines*
主要内容(){
运行阻塞
{
val smoothie=prepareSmoothie()
println(“制备木浆|用:$Smoothie制备的冰沙”)
}
}
私有挂起乐趣添加元素(索引:Int,项:String):String{
println(“准备商品|附加成分:$item”)
延迟(索引次数(3_000).toLong())
println(“准备商品|添加信用证:$item”)
返回“$item”
}
private suspend fun prepareSmoothie():列表{
println(“准备工作继续进行”)
println(“+
返回运行阻塞{
列表(“水果”、“谷物”、“风味增强剂”、“冰”)。地图索引{索引,项目->
异步的{
附加元件(索引,项目)
}.map{it.await()}
}
}
结果:
准备好了吗?继续
++++++++++++++++++++++
制备木糖|添加成分:水果
制备软泥|添加剂:颗粒
准备软糖|添加成分:风味助推器
准备软糖|添加成分:冰
++++++++++++++++++++++
制备木糖|添加成分:水果
制备软泥|添加成分:颗粒
制备软糖|添加成分:增味剂
准备软糖|添加成分:冰
++++++++++++++++++++++
制备软糖|冰沙由以下物质制成:[水果、谷物、增味剂、冰块]