我在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()
。
答案 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
}
}
});