Firebase getDownloadUrl не выполняется при успехе или при отказе

Я пытаюсь получить URL аудиофайла в облачном хранилище. Я могу отправлять сообщения в хранилище, но эта функция возвращает только null. При отладке он перескакивает через onSuccess и onFailure.

Я знаю, что переменная имени файла верна, но безуспешно пытался ее жестко запрограммировать. Я передаю mStorageRef как StorageReference. fileUrl в настоящее время является глобальной строкой.

mStorageRef = FirebaseStorage.getInstance().getReference();

String getFileUrl(String filename, StorageReference storageRef) {

        storageRef.child("music").child(filename).getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                fileUrl = uri.toString();
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                fileUrl = e.getMessage();
            }
        });

        return fileUrl;
    }

Файлы находятся в папке верхнего уровня с названием music.

Firebase getDownloadUrl не выполняется при успехе или при отказе

Где вы используете функцию getFileUrl?

Hardik Talaviya 02.04.2019 09:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
187
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

I can post to the storage just fine, but this function only returns null.

Вы не можете сейчас вернуть что-то, что еще не загружено. Другими словами, вы не можете просто создать переменную fileUrl как глобальную переменную и использовать ее вне метода onSuccess(), потому что она всегда будет null из-за асинхронного поведения этого метода. Это означает, что к тому времени, когда вы пытаетесь использовать этот результат вне этого метода, данные еще не закончили загрузку из базы данных и поэтому недоступны.

Быстрое решение этой проблемы состояло бы в том, чтобы использовать значение fileUrl, поступающее из базы данных, только внутри метода onSuccess(), в противном случае я рекомендую вам посмотреть последнюю часть моего ответа из этого сообщение, в котором я объяснил, как это можно сделать. с помощью пользовательского обратного вызова. Вы также можете взглянуть на этот видео для лучшего понимания.

Также убедитесь, что на устройстве пользователя есть стабильное интернет-соединение.

Другие вопросы по теме