Даже если вы используете al oop и теоретически загрузка изображений должна осуществляться в порядке итерации, вы не можете знать, сколько потребуется для фактической загрузки каждого изображения в Firebase Storage отдельно. Как отметил @DougStevenson в своем комментарии, вы загружаете все «параллельно». Таким образом, изображение меньшего размера может быть загружено намного быстрее, чем изображение большего размера, даже если изображение меньшего размера расположено сразу после изображения большего размера, поскольку для загрузки потребуется меньшее количество времени.
Решение этой проблемы состоит в том, чтобы дождаться загрузки изображения и начать следующую загрузку сразу после завершения загрузки предыдущего изображения. Обычно это делается с помощью рекурсии, с помощью метода, который вызывает себя.
private void uploadImageToFirebaseStorage() {
if (imageUriList.size() > 0) {
Uri imageUri = imageUriList.get(0);
StorageReference filereference = storageReference.child(System.currentTimeMillis()
+ "." + getFileExtension(imageUri));
imageUriList.remove(0);
uploadTask = filereference.putFile(imageUri);
uploadTask.continueWithTask(new Continuation() {
@Override
public Object then(@NonNull Task task) throws Exception {
if(!task.isSuccessful()){
throw task.getException();
}
return filereference.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
Uri downloadUri = task.getResult();
myUrl = downloadUri.toString();
myUrlList.add(myUrl);
uploadBeerImageToFirebaseStorage(); //Call when completes
}
}
});
}
}
Сначала запустите его с помощью uploadImageToFirebaseStorage()
. Как только изображение загружено, метод проверит, нужно ли делать больше, и повторно вызовет себя, если это так.