我正在玩Firebase存储,它被烘焙到一个照片集应用程序中,该应用程序收集照片并将它们上传到firebase存储后端。我想上传多张照片并等待所有任务完成,收集下载网址并继续下一步。这是我的代码如下
public void saveImageData() {
Incident incident = new Incident();
final ArrayList<Uri> downloadUris = new ArrayList<>();
StorageReference storageRef = storage.getReferenceFromUrl(Constants.FIREBASE_URL);
for (Uri uri : imageUris) {
StorageReference imagesRef = storageRef.child("images/" + uri.getLastPathSegment());
uploadTask = imagesRef.putFile(uri);
uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
downloadUris.add(taskSnapshot.getDownloadUrl());
Log.e(TAG, "Size of data: " + downloadUris.size());
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
}
}
我希望收集所有的uris并使用存储在downloadUris中的结果。当我输入这个时,我意识到这可能不是一个firebase问题,而是了解如何等待并行任务完成执行并继续执行结果。我怎样才能实现这个目标?谢谢
Play services Task API实际上支持Firebase客户端的大部分异步API,例如Firebase存储文件上传。您拥有的UploadTask是标准Task的子类,它接受成功和失败的侦听器,就像您现在正在做的那样。
如果您正在处理多个并发上载并希望知道它们何时完成,您可以使用Tasks实用程序类,该实用程序类具有接受多个Task对象的whenAll()方法。该方法将返回一个新任务,您可以在其中注册其他成功和失败侦听器。一旦所有任务完成,就会调用成功侦听器,并且如果任何任务失败,将调用失败侦听器。
您可以在各个任务以及从Tasks.whenAll()返回的复合任务中注册侦听器。
(另外,请继续关注使用具有各种Firebase功能的Task API的upcoming blog series。)