将Firebase中的图像存储在存储中时如何执行某些操作

时间:2018-11-28 17:22:29

标签: android firebase firebase-storage

我在firebase中存储了图像的url数组,并用于在移动存储中下载的循环,循环后,我在网格视图中将其他方法设置为showImages。下载没有问题,但是下载会花费一些时间,所以我只想在所有图像都成功存储到移动存储中之后执行showImage

如何执行此任务?任何帮助都会对我有很大帮助。

Class Images{
     string imageUrl;
     string name;

     public Images(){
     }
}

这是主要活动中用于下载图像的代码。

for (Image image : imageList) {
        String url = image.getImageUrl();
        File file = new File(context.getExternalFilesDir, i + "_" + image.getName() + ".jpg");
        if (!file.exists()) {
            StorageReference downloadRef = FirebaseStorage.getInstance().getReferenceFromUrl(url);
            downloadRef.getFile(file).addOnCompleteListener(new OnCompleteListener<FileDownloadTask.TaskSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<FileDownloadTask.TaskSnapshot> task) {
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                }
            });
            i++;
        }
    }
    showImages();

showImages()用于显示图像。但是它会在for循环后立即执行,并且随着图片的变大,下载会花费一些时间。

因此,只有成功下载所有图像后,我才能如何执行showImages()

1 个答案:

答案 0 :(得分:0)

StorageReference的getFile(File destinationFile)方法返回一个FileDownloadTask对象,该对象实际上是一个Task

要解决此问题,可以使用Tasks的whenAllSuccess(Collection> tasks)方法,如下所示:

List<Task<?>> tasks = new ArrayList<>();
tasks.add(downloadRef.getFile(file1));
tasks.add(downloadRef.getFile(file2));
tasks.add(downloadRef.getFile(file3));
//And so on
Tasks.whenAllSuccess(tasks).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
    @Override
    public void onSuccess(List<Object> list) {
        //Do what you need to do with your list
        for (Object object : list) {
            //Show images
        }
    }
});