Tasks.await无法用于FirebaseStorage

时间:2019-01-19 16:27:33

标签: java android firebase

我正在使用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] ++,但循环死机了。

1 个答案:

答案 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
     }
 });