我上傳了一個文件列表,我想使用我的應用下載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));
}
那個循環while(!task.isComplete())'不是一個好主意。您在等待下載完成時使此線程佔用100%的CPU。收集所有下載中的所有任務並將它們全部傳遞給Tasks.waitAll()以獲得可以等待完成的單個任務(如我在我的回答中所建議的),這樣會好得多。 –
沒有「Tasks.waitAll()」方法,我應該循環訪問此列表並調用Tasks.await()? – Mohamed
是的,有。我在我的回答中鏈接到了javadoc。 –