作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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]++,但循环只是卡住。
最佳答案
调用 Task.await()
在 Android 上是一个问题的秘诀,因为即使它有效,它实际上也会阻塞主线程。你确定你不是在寻找 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
}
});
关于java - Tasks.await 不适用于 FirebaseStorage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54269110/
我是一名优秀的程序员,十分优秀!