Android:从Firebase存储下载文件列表

时间:2017-04-04 10:15:10

标签: android firebase firebase-storage

我已将文件列表上传到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));

}

2 个答案:

答案 0 :(得分:1)

getFile返回FileDownloadTask对象,该对象是Task的子类。您可能知道,此任务会跟踪下载的进度。您可以选择立即启动所有下载,收集列表中的所有任务,然后使用Tasks.whenAll()获取在完成所有下载后完成的新任务。

我有four part blog series关于使用可帮助您更好地了解其工作原理的任务。

答案 1 :(得分:0)

制作childsRef hashmap并添加一个布尔值以查看下载是否完成。 在onSuccess时设置值为true,并在下载完成时使处理程序发送消息以检查所有布尔值是否为true。而不是从处理程序开始您的活动。