Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Firebase Kotlin执行顺序和结果问题_Firebase_Kotlin_Storage - Fatal编程技术网

Firebase Kotlin执行顺序和结果问题

Firebase Kotlin执行顺序和结果问题,firebase,kotlin,storage,Firebase,Kotlin,Storage,我正试图通过listAll从firebase的存储中获取所有文件 顺便说一下 storageReference.listAll().addOnSuccessListener { listResult -> val image_task : FileDownloadTask for (fileRef in listResult.items) { fileRef.downloadUrl.ad

我正试图通过listAll从firebase的存储中获取所有文件

顺便说一下

storageReference.listAll().addOnSuccessListener { listResult ->
                val image_task : FileDownloadTask
                for (fileRef in listResult.items) {
                    fileRef.downloadUrl.addOnSuccessListener { Uri ->
                        image_list.add(Uri.toString())

                        println("size1 : " + image_list.size)
                    }
                }
                println("size2 : " + image_list.size)

            }//addOnSuccessListener

为什么执行命令是这样的


我该如何解决它???

这里的执行顺序没有问题

fileRef.downloadUrl.addOnSuccessListener { Uri ->
downloadUrl
是一个异步操作,这意味着它不会等待操作实际完成,以便与代码一起移动

您通过成功侦听器接收结果(至少在本例中是这样)
如果您想按顺序处理它,请查看。

当您向某个对象添加侦听器或回调时,侦听器中的代码直到稍后才会被调用。当前函数中的所有其他内容都将首先发生

您正在使用for循环为每个项添加侦听器。侦听器中尚未运行任何代码。然后在for循环之后进行“size2”
println
调用。在以后的某个时候,你所有的听众都会被炒鱿鱼

如果希望这样的异步代码按顺序编写,则需要使用协同路由。这是一个巨大的主题,但是您的代码看起来像这样(但是如果您想要正确地处理错误,可能会比这更复杂一些)。我正在使用Android活动或片段中的
lifecycleScope
作为示例。如果你不在安卓系统上,你需要使用其他的协同程序

await()
的调用是添加成功和失败侦听器的替代方法
wait()
挂起协同路由,然后返回结果或在失败时引发异常

lifecycleScope.launch {
    val results = try {
            storageReference.listAll().await()
        } catch (e: Exception) {
            println("Failed to get list: ${e.message}")
            return@launch
        }
    val uris = try {
            results.map { it.downloadUrl.await().toString() }
        } catch (e: Exception) {
            println("Failed to get at least one URI: ${e.message}")
            return@launch
        }
    image_list.addAll(uris)
}

按那个顺序到底出了什么问题?在
size1
之前打印的
size2
?没错,我认为应该先打印尺寸1,然后打印尺寸2。如图所示,尺寸2首先打印为0,尺寸1随后打印。。。