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

时间:2019-02-16 17:51:00

标签: android firebase google-cloud-firestore storage

我在URI文件上有一个数组,并使用for循环将它们上传到Firebase存储上。根据文档,我可以获得在continueWithTask对象上实现addOnCompleteListenerUploadTask方法的下载URL,因此我尝试将所有URL保存在数组中。我的问题是,我用来保存url的数组为空,但是在计算代码之后,图像就上传到了Firestore存储文件夹中,这可能是因为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);
                }
            }
        });    
}

请求网址后,我的数组downloadUrl为空

1 个答案:

答案 0 :(得分:1)

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

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

在执行此处描述的内容后,它的外观如何。 (我没有运行代码。可能有一些小错误。)

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();