我遇到的问题是我的saveStore
函数没有等待uploadImagesFunction
函数。最后一个函数循环通过一个包含多个图像的数组,并将每个图像加载到Firebase Storage中。saveStore
函数应该只在所有图像都处理完后才被调用。为此,我使用runBlocking
协程。问题是saveStore
总是立即被调用而不等待第一个方法完成。我必须改变什么?
binding.save.setOnClickListener {
runBlocking(Dispatchers.IO) {
uploadImagesFunction()
saveStore()
}
}
...
private fun uploadImagesFunction(){
val storeImageRef = storageRef.child("/storeImages/${UUID.randomUUID()}.jpg")
uploadImages.forEach { element ->
var file = element
val uploadTask = storeImageRef.putFile(file)
uploadTask.addOnFailureListener {
//Error
...
}.addOnSuccessListener { taskSnapshot ->
//Success - go on
}
}
}
private fun saveStore(){
val store = hashMapOf(
"name" to binding.storeName.editableText.toString(),
...
)
db.collection("stores").add(store).addOnSuccessListener {document->
... }
}
字符串
2条答案
按热度按时间ycggw6v21#
这里没有使用
suspend
函数,所以没有真正使用协程。您的函数是使用另一种异步机制(基于回调)的常规函数。如果你真的想使用协程,你应该让这些协程调用挂起,而不是使用回调。
如果您使用的是Firebase,您可能可以利用kotlinx-coroutines-play-services库,并为此使用Task.await()或Task.asDeferred()函数,而不是使用
addOnSuccessListener
等。例如:
字符串
请注意,您在这里为每个图像分配了相同的UUID,这可能不是您想要的。您可能应该为列表中的每个项目生成一个新的UUID(只需将
storageRed.child(...)
调用移动到map
中)。ss2ws0br2#
不推荐使用
runBlocking
,因为它会导致UI无响应。您应该使用协程来利用异步编程。字符串