2017-04-04 10 views
0

私は自分のアプリを使ってダウンロードしたいFirebaseにファイルリストをアップロードしました。Android: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 
     } 
}); 
} 

ダウンロードプロセスは非同期であるので、私は進行をダウンロード可視化するためにポップアップを表示することはできません。 ..すべての保留中のダウンロードが完了した場合にのみ、次のアクティビティに移動したいと考えています。

アイデアや助けがありますか?

--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())'は本当に良いアイデアではありません。ダウンロードが完了するのを待っている間、このスレッドはCPUを100%消費します。すべてのダウンロードからすべてのタスクを集めてTasks.waitAll()に渡して、完了まで待つことができる1つのタスクを得ることは、私の答えでお勧めします。 –

+0

このリストをループしてTasks.wait()を呼び出すと、 "Tasks.waitAll()"メソッドはありません。 – Mohamed

+0

はい、あります。私は答えのためにjavadocにリンクしました。 –

答えて

1

getFileは、TaskのサブクラスであるFileDownloadTaskオブジェクトを返します。ご存知のように、このタスクはダウンロードの進行状況を追跡します。一度にすべてのダウンロードを開始し、リスト内のすべてのタスクを収集し、Tasks.whenAll()を使用して、すべてのダウンロードが完了したら完了する新しいタスクを取得するオプションがあります。

私はfour part blog seriesに、仕事の仕組みを理解するのに役立つタスクを使用しています。

+0

ありがとう!ソリューションを示すために私の答えを更新しました – Mohamed

0

はchildsRefのハッシュマップを作成し、ダウンロードが完了するかどうかを確認するためにブール値を追加します。 onSuccessを設定するとtrueに設定され、ブール値がすべて真であるかどうかを確認するためにダウンロードが完了したときにメッセージを送信するハンドラを作成します。ハンドラからあなたの活動を開始するよりも。

関連する問題