我已将文件列表上传到Firebase,我想使用我的应用下载。
List<String> childsRef = new ArrayList<>();
childsRef.add("xxxx/img1");
childsRef.add("xxxx/img2");
... etc
然后,通过此列表,我尝试使用Firebase storageReference下载文件:
for (String child : childsRef) {
islandRef = storageRef.child(child);
File localFile = File.createTempFile("images", "jpg");
islandRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
// Local temp file has been created
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
}
});
}
下载过程是异步的,因此我无法显示弹出窗口以显示下载进度...我只想在所有待处理的下载完成后导航到下一个活动..
你有什么想法/帮助吗?
- 编辑 解决方案:
FirebaseStorage instance = FirebaseStorage.getInstance();
StorageReference referenceFromUrl = instance.getReferenceFromUrl("gs://xxxxxxx.appspot.com/");
for (final String aur : aurl) {
final File localFile = new File(PATH + aur.substring(aur.lastIndexOf("/") + 1, aur.lastIndexOf(".")) + ".dat");
StorageReference f = referenceFromUrl.child(aur);
FileDownloadTask task = f.getFile(localFile);
task.addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
size += localFile.length();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
Log.e("firebase ", ";local tem file not created created " + exception.toString());
}
});
while (!task.isComplete()) {
}
publishProgress("" + (int) ((float) i++ * 100 / aurl.length));
}
答案 0 :(得分:1)
getFile返回FileDownloadTask对象,该对象是Task的子类。您可能知道,此任务会跟踪下载的进度。您可以选择立即启动所有下载,收集列表中的所有任务,然后使用Tasks.whenAll()获取在完成所有下载后完成的新任务。
我有four part blog series关于使用可帮助您更好地了解其工作原理的任务。
答案 1 :(得分:0)
制作childsRef hashmap并添加一个布尔值以查看下载是否完成。 在onSuccess时设置值为true,并在下载完成时使处理程序发送消息以检查所有布尔值是否为true。而不是从处理程序开始您的活动。