如何执行多个firebase上传并等待集合结果

时间:2016-09-07 04:49:05

标签: java android firebase-storage

我正在玩Firebase Storage,它被烘焙到一个照片集应用程序中,该应用程序收集照片并将它们上传到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问题,而是了解如何等待并行任务完成执行并继续执行结果。我怎样才能实现这个目标? 感谢

1 个答案:

答案 0 :(得分:7)

Play services Task API实际上支持Firebase客户端的大部分异步API,例如Firebase存储文件上传。您拥有的UploadTask是标准Task的子类,它接受成功和失败的侦听器,就像您现在正在这样做。

如果您正在处理多个并发上传并希望知道所有这些上传完成后,您可以使用Tasks实用程序类,该实用程序类具有接受多个Task对象的whenAll()方法。该方法将返回一个新任务,您可以在其中注册其他成功和失败侦听器。一旦所有任务完成,就会调用成功侦听器,并且当任何任务失败时,将调用失败侦听器。

您可以在各个任务以及从Tasks.whenAll()返回的复合任务中注册侦听器。

(另外,敬请关注使用具有各种Firebase功能的Task API的upcoming blog series。)