我正在使用FirebaseStorage下载多个文件。下载文件的任务在WHILE循环内。 WHILE循环位于另一个FOR循环内。问题是我希望WHILE循环仅在所有下载完成后才向前移动。我尝试使用Tasks.await(task),但似乎不起作用。你们能帮我吗?
For (DataSnapshot ds: datasnapshot.getChildren()){
...
while (i[0] < imgs.length) {
Task<Uri> task = mStorageReference.child(uid).child("notes").child(imgname).getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
...
});
try {
Tasks.await(task);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
i[0]++;
}
}
我还尝试在存储任务中使用i [0] ++,但循环死机了。
答案 0 :(得分:1)
在Android上调用Task.await()
是解决问题的秘诀,即使它起作用,实际上也会阻塞主线程。您确定不是要寻找Task.whenAllComplete()
,它会返回Task
并在所有getDownloadUrl
任务完成时完成的事情。
实现它看起来像这样:
List<Task<Uri>> downloadUrlTasks = new LinkedList<Task<Uri>>();
while (i[0] < imgs.length) {
Task<Uri> task = mStorageReference.child(uid).child("notes").child(imgname).getDownloadUrl();
downloadUrlTasks.add(task);
i[0]++;
}
try {
Tasks.whenAllComplete(downloadUrlTasks).addOnCompleteListener(new OnCompleteListener<List<Task<Uri>>() {
@Override
public void onComplete(@NonNull List<Task<Uri>> tasks) {
// All tasks have completed, now you can get all download URLs by looping over the tasks
}
});
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
更简单:如果仅从服务器成功获取所有下载URL,则只想处理它们,则可以使用Tasks. whenAllSuccess
:
Tasks.whenAllSuccess(downloadUrlTasks).addOnSuccessListener(new OnSuccessListener<List<Uri>() {
@Override
public void onSuccess(@NonNull List<Uri> uris) {
// All tasks have succeeded, the uris list contains all download URLs
}
});