【问题标题】:How can i get the url of the images after i've uploaded them with a for loop on firebase storage?在我在firebase存储上使用for循环上传图像后,如何获取图像的url?
【发布时间】:2019-07-10 13:55:16
【问题描述】:

我有一个关于 URI 文件的数组,我使用 for 循环将它们上传到 firebase 存储。按照文档,我可以获得在UploadTask 对象上实现continueWithTaskaddOnCompleteListener 方法的下载url,所以我尝试将所有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为空

【问题讨论】:

    标签: android firebase google-cloud-firestore storage


    【解决方案1】:

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

    当我搜索时,已有帖子询问如何等待多个回调。我在其中一个中发布了答案。 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();
    

    【讨论】:

      猜你喜欢
      • 2021-10-12
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      • 2017-11-24
      • 2019-12-31
      • 2018-01-24
      • 2020-08-28
      • 1970-01-01
      相关资源
      最近更新 更多