2017-04-04 91 views
0

我上傳了一個文件列表,我想使用我的應用下載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。 –

回答

1

getFile返回一個FileDownloadTask對象,它是Task的一個子類。正如您可能知道的那樣,此任務會跟蹤下載的進度。您可以選擇立即開始所有下載,收集列表中的所有任務,然後使用Tasks.whenAll()獲得一個新的任務,在所有下載完成後完成。

我有一個four part blog series關於使用任務,可以幫助您更好地瞭解他們如何工作。

+0

謝謝!我更新了我的答案以顯示解決方案 – Mohamed

0

使childsRef HashMap和添加一個布爾值,看看是否下載完成。 當onSuccess設置值爲true並且在下載完成時發送消息以處理髮送消息以檢查所有布爾值是否爲true。比從處理程序開始你的活動。