java - 我如何执行多个 firebase 上传并等待集体结果

标签 java android firebase-storage

我正在尝试将 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) {

            }
        });
    }
}

我希望收集所有 URI 并使用存储在 downloadUris 中的结果。当我输入这个时,我意识到这可能不是一个 firebase 问题,而是了解如何等待并行任务完成执行并继续处理结果。我怎样才能实现这个目标? 谢谢

最佳答案

Play services Task API实际上为许多 Firebase 客户端异步 API 提供支持,例如 Firebase 存储文件上传。您拥有的 UploadTask 是标准 Task 的子类接受成功和失败的监听器,就像您现在所做的那样。

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

您既可以在单个任务上注册监听器,也可以在从 Tasks.whenAll() 返回的复合任务上注册监听器。

(另外,请继续关注 upcoming blog series 关于使用具有各种 Firebase 功能的任务 API。)

关于java - 我如何执行多个 firebase 上传并等待集体结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39361415/

相关文章:

java - 避免使用 web.xml 硬编码 WSDL 位置

java - Weblogic服务器: Copy files to shared location within network using Java

javascript - android webview 包含 javascript

android - 将对象上传到 fireBase,并在 android 上附加图像

android - 如何从 Firebase Storage 下载文件到 Android 的 External_Storage

java - 停止在 Android APK 中生成 javax.annotation 源文件

java - Jersey 在选择适当的静态端点时考虑 MIME 类型的优先级顺序(包含在请求的接受 header 中)

android - 防止重复条目 parse.com

android - 未找到 int org.libsdl.app.SDLActivity.nativeSetupJNI() 的实现

ios - 使用缓存中的图像创建图像数组 (Swift)