Kotlin执行顺序和结果问题



我正试图通过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

在此处输入图像描述

为什么执行命令是这样的?

我该如何解决??

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

您正在使用for循环为每个项目添加侦听器。侦听器中尚未运行任何代码。然后你的";size2";在for循环之后进行println调用。稍后,你所有的听众都会开火。

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

await()的调用是添加成功和失败侦听器的替代方法。await()挂起协同程序,然后返回结果或在失败时抛出异常。

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)
}

这里的执行顺序没有任何问题。

fileRef.downloadUrl.addOnSuccessListener { Uri ->

CCD_ 5是一个异步动作,这意味着它不需要等待动作真正完成才能与代码一起移动。

您通过成功侦听器接收结果(至少在这种情况下(如果你想按顺序处理它,可以看看协同程序。

相关内容

  • 没有找到相关文章

最新更新