在Javascript中,您可以同时启动两个(或多个)异步任务,等待它们都完成,然后执行一些操作/继续:
const [firstReturn, secondReturn] = await Promise.all([
firstPromise,
secondPromise ];
// Do something with first and second return.
我想在Kotlin(Android)中做的是开始从Firebase下载两个图像,并且两个下载都完成后-用它们更新UI。所以我有两个这样的Firebase异步函数:
FirebaseStorage.getInstance().reference..child("Images/Events/$eventID/eventPhoto.jpeg").getBytes(1024 * 1024).addOnSuccessListener { byteArray ->
event.image = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)
}
//And another one with different path
我曾考虑过使用Kotlin的“异步/等待”功能,但由于无法从Firebase函数返回值,因此无法正常工作。在Kotlin中是否有一种简单的方法可以做到这一点,所以我可以同时开始下载两个图像,并在两个图像都下载后做一些工作?
答案 0 :(得分:1)
您可能想利用Play服务与here中记录的协程的集成。从该库中获得的是称为await()
的Task(由Play和Firebase异步API返回)的扩展功能,您可以在协程中使用它来推迟执行直到完成。
答案 1 :(得分:0)
因此,我按照道格的建议使用“播放服务集成”。我想问一下我何时编写这样的代码:
val downloadFirstImageTask = FirebaseStorage.getInstance().reference.child(somePath).getBytes(1024 * 1024)
val downloadSecondImageTask = FirebaseStorage.getInstance().reference.child(someOtherPath).getBytes(1024 * 1024)
try {
val downloadedImages = mutableListOf<ByteArray>(downloadFirstImageTask.await(), downloadSecondImageTask.await())
} catch (e: StorageException) {
// error handling
}
downloadFirstImageTask.await()和downloadSecondImageTask.await()是同时下载还是downloadFirstImageTask.await()先下载然后再下载?