首页 > 解决方案 > 从 firebase 存储中获取多个下载 URL 并将它们保存到 firebase firestore

问题描述

我已成功将多个选定的音频文件上传到 Firebase 存储,并且能够检索所有这些文件的 URL。由于我必须上传多个文件,因此我使用 for 循环来执行此操作。上传文件并检索 URL 后,我想将它们保存到 firestore,这就是我为此所做的。

上传文件的功能

private void uploadAudioFiles(List<Uri> list, final Map<String, String> hashMap) {
        if (list.size() > 0){
            for (int a=0; a<list.size(); a++){
                Uri perFile = list.get(a);
                String filename = getSelectedFileName(perFile);
                final StorageReference audioFileReference = referenceFolder.child("audioClipData/"+filename);
                final int finalA = a;
                audioFileReference.putFile(perFile).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        audioFileReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                            @Override
                            public void onSuccess(Uri uri) {
                                hashMap.put("audioFile"+ finalA, String.valueOf(uri));
                                Log.e("APP_LOG:HashMap(AudioA)", String.valueOf(hashMap));
                            }
                        });
                    }
                });
            }
        }
    }

点击保存按钮

下面是调用uploadAudioFiles() 函数的代码。

Map<String, String> hashMap = new HashMap<>();
    String username = name.getText().toString();
            if (!username.isEmpty()){
                progressDialog.show();
                hashMap.put("username", username);
                uploadAudioFiles(audioClipList, hashMap);


                Log.e("APP_LOG:HashMapFINAL", hashMap.toString());
                firestore.collection(currentUser.getUid()).add(hashMap).addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                    @Override
                    public void onSuccess(DocumentReference documentReference) {
                        progressDialog.dismiss();
                    }
                });
            }else {
                name.setError("Required");
            }

这是我在 uploadAudioFiles() 函数中得到的日志

E/APP_LOG:HashMap(AudioA): {username=Abhi, audioFile0= https://firebasestorage.googleapis.com/v0/b/myapp.appspot.com/o/linktofile }

这是我在uploadAudioFiles()(ButtonClick)函数之外时得到的日志

E/APP_LOG:HashMapFINAL: {username=Abhi}

现在我不明白为什么当我在uploadfile 函数中和在uploadfile 函数之外时HashMap 是不同的。这是因为 for 循环的范围还是其他原因?

有人可以帮我了解情况和解决方法吗?

标签: androidfirebasehashmapgoogle-cloud-firestorefirebase-storage

解决方案


Firebase API 是异步的,会在工作完成前立即返回。只要上传完成并且下载 URL 已知,您的 HashMap 就会随着时间而改变。如果你想知道所有的上传什么时候完成,并且知道所有的下载地址,你需要关注它们返回的Task对象。现在,您的 uploadAudioFiles 函数将在任何工作完成之前立即返回,并且在它之后运行的代码将在一段时间后才能看到任何结果。


推荐阅读