android - 从 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 循环的范围还是其他原因?
有人可以帮我了解情况和解决方法吗?
解决方案
Firebase API 是异步的,会在工作完成前立即返回。只要上传完成并且下载 URL 已知,您的 HashMap 就会随着时间而改变。如果你想知道所有的上传什么时候完成,并且知道所有的下载地址,你需要关注它们返回的Task对象。现在,您的 uploadAudioFiles 函数将在任何工作完成之前立即返回,并且在它之后运行的代码将在一段时间后才能看到任何结果。
推荐阅读
- c++ - 如何修复被推回向量的垃圾值
,当我推送一个包含整数的字符串时 - r - 抑制 R 脚本的输出
- javascript - 如何在 React-Native 的屏幕两侧显示 NavigationDrawer?
- https - Possible reasons to Base64encode the password in a HTTPS request
- elasticsearch - 弹性搜索如何获取日期直方图 Agg 桶中所有百分位值的总平均值
- tensorflow - 从字符串重新创建张量
- javascript - 通过简单的 JS 强制 iframe 自动播放
- javascript - 页面未提交,列表框中有大量项目
- unity3d - 网格文本与画布文本性能
- neo4j - 如何在 neo4j Movie Graph 上让演员拥有不止一部电影