私は自分のアプリを使ってダウンロードしたい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));
}
そのループ 'while(!task.isComplete())'は本当に良いアイデアではありません。ダウンロードが完了するのを待っている間、このスレッドはCPUを100%消費します。すべてのダウンロードからすべてのタスクを集めてTasks.waitAll()に渡して、完了まで待つことができる1つのタスクを得ることは、私の答えでお勧めします。 –
このリストをループしてTasks.wait()を呼び出すと、 "Tasks.waitAll()"メソッドはありません。 – Mohamed
はい、あります。私は答えのためにjavadocにリンクしました。 –