android - 异步结果的类型是什么?

标签 android kotlin async-await coroutine

我正在尝试在循环中创建一些协程(异步)。我想并行开始所有事情,然后等待它们全部完成然后再继续。 documentation提供以下示例:

    coroutineScope {
        val deferreds = listOf(      // fetch two docs at the same time
            async { fetchDoc(1) },  // async returns a result for the first doc
            async { fetchDoc(2) }  // async returns a result for the second doc        
       deferreds.awaitAll()         // use awaitAll to wait for both network requests
    }

但这要求提前知道所有类实例化。然而,对于不同数量的实例,这是不切实际的。作为解决方法,我发现以下方法有效: 给定 MyObject 类中的类对象的可变列表,并且 MyObject 有一个名为 myDo()

的方法
    private val mObjects = mutableListOf<MyObject>()

并忽略错误检查并假设列表有 2 个或更多对象,则以下内容可以工作,但有点笨拙且不太优雅

    coroutineScope {
    val pd = async { myObjects[0].myDo() }
    val dds = mutableListOf(pd)
        for (i in 1..numObjects - 1) {
                dds.add(async {mObjects[i].myDo() })
            }
            val nds = dds.toList()
            nds.awaitAll()
        }// end coroutineScope

我希望做的事情是这样的

    val dds = mutableListOf<Job>()
    for (i in 0..numObjects - 1) {
                dds.add(async {mObjects[i].myDo() })
           }
    val nds = dds.toList()
    nds.awaitAll()

但这不起作用,因为异步结果是

    Deferred<out T> : Job

接口(interface)不是作业接口(interface)。问题就出在这行

    val dds = mutableListOf<Job>()

我不知道用什么来代替 Job。也就是说,对于异步来说,T 是什么?

如有任何帮助或建议,我们将不胜感激

最佳答案

T在这种情况下是任何类型 myDo()返回。

我认为您通过创建额外的 MutableLists 使事情变得过于复杂。你可以这样做:

val results = coroutineScope {
    mObjects.map { obj ->
        async { obj.myDo() }
    }.awaitAll()
}

results将是 List<MyDoReturnType> .

编辑:我刚刚意识到,因为您并不明显知道 Deferred 的类型是什么 async lambda 返回,也许是因为 myDo()不返回任何内容(隐式返回单位)。如果是这种情况,您应该使用 launch而不是async 。它们之间唯一的区别是async的 lambda 返回一些内容并且 launch的没有。 Deferred 继承自 Job,因为 Deferred 是一个有结果的 Job。如果myDo()不返回任何内容,您的代码应如下所示,没有结果。

coroutineScope {
    for (obj in mObjects) launch { obj.myDo() }
}

关于android - 异步结果的类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70869512/

相关文章:

java - 通过反射将值设置为java类?

android - 来自一个 Activity 的多个异步任务

android - 不按按钮关闭警报对话框

android - 如何从另一个 ViewHolder 中获取对 ViewHolder 的引用? (回收 View )

kotlin - 如何遍历数组,其中每次迭代都是子数组而不是元素

javascript - 等待/异步不在 for 循环中工作

c# - 异步总是 WaitingForActivation

javascript - async/await 函数的返回值

android - 当前选择的 Java 调试器不支持类型为 'Kotlin Line Breakpoints' 的断点

arrays - "No set method providing array access"-- 为什么在 Kotlin 中会发生这种情况?