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

问题描述:

我上传了一个文件列表,我想使用我的应用下载Firebase。Android:从Firebase存储下载文件列表

List<String> childsRef = new ArrayList<>(); 
childsRef.add("xxxx/img1");  
childsRef.add("xxxx/img2"); 
... etc 

然后,通过这个名单,我尝试使用我的火力地堡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 
     } 
}); 
} 

下载过程是异步的,所以我不能显示弹出式窗口可视化下载进程。 ..只有当所有未完成的下载完成后,我才能导航到下一个活动。

您有任何想法/帮助吗?

--edit 解决方案:

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

那个循环while(!task.isComplete())'不是一个好主意。您在等待下载完成时使此线程占用100%的CPU。收集所有下载中的所有任务并将它们全部传递给Tasks.waitAll()以获得可以等待完成的单个任务(如我在我的回答中所建议的),这样会好得多。 –

+0

没有“Tasks.waitAll()”方法,我应该循环访问此列表并调用Tasks.await()? – Mohamed

+0

是的,有。我在我的回答中链接到了javadoc。 –

getFile返回一个FileDownloadTask对象,它是Task的一个子类。正如您可能知道的那样,此任务会跟踪下载的进度。您可以选择立即开始所有下载,收集列表中的所有任务,然后使用Tasks.whenAll()获得一个新的任务,在所有下载完成后完成。

我有一个four part blog series关于使用任务,可以帮助您更好地了解他们如何工作。

+0

谢谢!我更新了我的答案以显示解决方案 – Mohamed

使childsRef HashMap和添加一个布尔值,看看是否下载完成。 当onSuccess设置值为true并且在下载完成时发送消息以处理发送消息以检查所有布尔值是否为true。比从处理程序开始你的活动。