在 firebase 存储上使用 for 循环上传图像后,如何获取图像的 url?

How can i get the url of the images after i've uploaded them with a for loop on firebase storage?

我在 URI 文件上有一个数组,我使用 for 循环将它们上传到 firebase 存储。按照文档,我可以下载 url 在 UploadTask 对象上实现 continueWithTaskaddOnCompleteListener 方法,所以我尝试将所有 url 保存在一个数组中.我的问题是我用来保存 url 的数组是空的,但是在计算代码后图像上传到 firestore Storage 文件夹可能是因为 continueWithTaskaddOnCompleteListener 是异步方法.

我该如何解决?

for (int i = 0; i < photos.size(); i++) {   
 mStorage=FirebaseStorage.getInstance().getReference().child("images/" + j);
mUploadTask=mStorage.putFile(photos.get(i));

Task<Uri>urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
            @Override
            public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
                if(!task.isSuccessful()){
                   throw task.getException();
               }
               return mStorage.getDownloadUrl();
            }
        }).addOnCompleteListener(new OnCompleteListener<Uri>() {
            @Override
            public void onComplete(@NonNull Task<Uri> task) {
               if(task.isSuccessful()){
                    String url = task.getResult().toString();
                    downloadUrl.add(url);
                }
            }
        });    
}

url

请求后我的数组downloadUrl为空

您可以一个一个地上传文件,然后将 Uri 添加到列表中。由于上传是一个异步任务,你必须将整个块包装到一个新的线程中并等待每个完成让它们一个一个执行。

我搜索了一下,已有帖子询问如何等待多次回调。我在其中一个中发布了答案。 Here 是答案的 link。 检查后进一步阅读。

这里是实施那里描述的内容后的样子。 (我没有运行代码,可能有小错误。)

new Thread(new Runnable() {
    @Override
    public void run() {
        final List < String > urls = new ArrayList();

        for (int i = 0; i < photos.size(); i++) {
            mStorage = FirebaseStorage.getInstance().getReference().child("images/" + j);
            mUploadTask = mStorage.putFile(photos.get(i));

            final ThreadLockedTask < String > t = new ThreadLockedTask < > ();
            final String url = t.execute(new Runnable() {
                @Override
                public void run() {
                    Task < Uri > urlTask = uploadTask.continueWithTask(new Continuation < UploadTask.TaskSnapshot, Task < Uri >> () {
                        @Override
                        public Task < Uri > then(@NonNull Task < UploadTask.TaskSnapshot > task) throws Exception {
                            if (!task.isSuccessful()) {
                                t.setResult(null);
                                throw task.getException();
                            }
                            return mStorage.getDownloadUrl();
                        }
                    }).addOnCompleteListener(new OnCompleteListener < Uri > () {
                        @Override
                        public void onComplete(@NonNull Task < Uri > task) {
                            if (task.isSuccessful()) {
                                String url = task.getResult().toString();
                                t.setResult(url);
                            }
                        }
                    });


                }
            });
            if(url!=null)
                urls.add(url);
        }

        //Now you have all the urls in the list "urls"
    }
}).start();