android 我怎么能在所有forEach通道之后只读出一个列表呢?

xkrw2x1b  于 2022-12-28  发布在  Android
关注(0)|答案(1)|浏览(75)

我想上传多张图片到Firebase,获取每张图片的URL,我使用了一个任务,目前为止一切正常,但是怎么才能在forEach任务完成后才读出带有URL的列表呢?目前的情况是列表只在日志中输出,为空,然后跳转到forEach:

Tasks.whenAllSuccess<UploadTask>(tasks).addOnSuccessListener {
    val downloadUrls = mutableListOf<String>()

    tasks.forEach {
        it.result.metadata!!.reference!!.downloadUrl.addOnSuccessListener { snap->
            downloadUrls.add(snap.toString())
            Log.e("Downloadable Image URL",snap.toString())
        }
    }
    
    //The list here is empty
    Log.d("List with URLs",downloadUrls.toString())
    progressDialog.dismiss()
}
4nkexdtk

4nkexdtk1#

当你打电话的时候:

Log.d("List with URLs",downloadUrls.toString())

添加文件到存储的操作还没有完成。这就是为什么你得到一个空列表的原因。如果你想看到downloadUrls列表的内容,你必须只在操作100%完成时才使用该日志语句。现在,既然你使用的是Kotlin,我建议你使用Kotlin Coroutines。所以你的代码可以写得很简单:

val downloadUrls = mutableListOf<String>()
val listOfTasks = Tasks.whenAllSuccess<UploadTask>(tasks).await()
listOfTasks.forEach {
    val downloadUrl = it.result.metadata!!.reference!!.downloadUrl.await()
    downloadUrls.add(downloadUrl)
}
Log.d("List with URLs",downloadUrls.toString())

相关问题