Как загрузить несколько файлов в базу данных Firebase в порядке, как в Arraylist? - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь добавить несколько изображений в Firebase, но похоже, что он не загружается по порядку. Я считаю, что myUrlList добавляется в зависимости от порядка загрузки на сервер. Есть ли способ сортировки myUrlsList так же, как imageUrlList?

    for(int i=0; i< imageUriList.size(); i++){
            final StorageReference filereference = storageReference.child(System.currentTimeMillis()
                    + "." + getFileExtension(imageUriList.get(i)));

            uploadTask = filereference.putFile(imageUriList.get(i));
            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);

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Даже если вы используете 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(). Как только изображение загружено, метод проверит, нужно ли делать больше, и повторно вызовет себя, если это так.

0 голосов
/ 28 февраля 2020

получите имя от arraylist, создайте новый обработчик и выполните runnable. Теперь каждый раз, когда выполняется загрузка, он создает новый runnable для другого файла и затем загружает файл как ваше требование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...