我正在尝试使用协同程序将Firebase存储数据显示到recyclerview。当我这样做时,它不显示图像,而是显示空的recyclerview。 这是代码
public virtual ICollection<Address> Address{ get; set; }
当我将delay(1000)放在getImages()的末尾时,数据将正确显示。 请帮助
答案 0 :(得分:1)
addOnSuccessListener
不会在分配的同时被调用,协程将在完成之前退出。您可以在forEach循环之后调用updateAdapter
。
示例:
// onCreate
CoroutineScope(Dispatchers.Main).launch {
getImages()
}
private suspend fun getImages() =
withContext(Dispatchers.IO) {
storageReference.listAll().addOnSuccessListener { listResult ->
listResult.items.forEach { storageRef ->
storageRef.downloadUrl.addOnSuccessListener {
imageList.add(ImageItem(it))
}
}
updateAdapter()
}
}
或者,如果您想使用当前使用的相同架构,则可以使用suspendCoroutine。
// onCreate
CoroutineScope(Dispatchers.Main).launch {
getImages()
updateAdapter()
}
private suspend fun getImages() =
withContext(Dispatchers.IO) {
suspendCoroutine { cont ->
storageReference.listAll().addOnSuccessListener { listResult ->
listResult.items.forEach { storageRef ->
storageRef.downloadUrl.addOnSuccessListener {
imageList.add(ImageItem(it))
}
}
cont.resume(Unit)
}
}
}