Как вернуть логическое значение, если файл успешно загружен в onSuccessListener? - PullRequest
0 голосов
/ 26 апреля 2020

Сначала посмотрите на это. Я вызываю функцию uploadUserPdf () внутри submitProfile ()

public void submitProfile() {
     if(!uploadUserPdf()) {
          return;
     }
     else {
        //...............
     }
}

А вот функция uploadUserPdf () функция

private boolean uploadUserBiodataPdf() {
        Uri fileUri = Uri.parse(Pdf);
        final StorageReference storageReference = FirebaseStorage.getInstance().getReference().child("Pictures");
        StorageReference pdfRef = storageReference.child(mUser.getUid()).child(fileUri.getLastPathSegment());

        pdfRef.putFile(fileUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                pdfRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        Pdf = uri.toString();
                        Toast.makeText(ContinueProfile.this, "Pdf Uploaded", Toast.LENGTH_LONG).show();
                    }
                });
            }
        });
        return false;
    }

Я хочу вернуть true, если файл успешно загружен . Но я не могу найти места для записи return true . Можно ли вернуть истинное значение, если файл успешно загружен ??

1 Ответ

1 голос
/ 26 апреля 2020

Загрузка файла в Firebase Storage происходит асинхронно, так как это может занять некоторое время. Пока загрузка происходит в фоновом режиме, ваш основной код продолжает выполняться на переднем плане. Затем, когда загрузка завершится, будет вызван ваш onSuccess.

Это означает, что к моменту запуска return false ни один из ваших onSuccess методов не был вызван. И вы не можете вернуть что-то сейчас , которое еще не произошло.

По этой причине любой код, который требует URL-адрес для загрузки, должен находиться внутри метода onSuccess, который вызывается при этот загрузочный URL был получен с сервера. Как ваш Toast, который запускается в нужное время.

Если вы хотите сохранить код, использующий URL-адрес загрузки, отдельно от кода, который его генерирует, вы можете передать пользовательский интерфейс обратного вызова, а затем вызовите его, когда получите URL-адрес для загрузки:

public interface GetDownloadUrlCallback {
  void onCallback(String uri);
}
private boolean uploadUserBiodataPdf(GetDownloadUrlCallback callback) {
    Uri fileUri = Uri.parse(Pdf);
    final StorageReference storageReference = FirebaseStorage.getInstance().getReference().child("Pictures");
    StorageReference pdfRef = storageReference.child(mUser.getUid()).child(fileUri.getLastPathSegment());

    pdfRef.putFile(fileUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            pdfRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                @Override
                public void onSuccess(Uri uri) {
                    callback(uri.toString());
                }
            });
        }
    });

, а затем назовите его с помощью:

GetDownloadUrlCallback(new GetDownloadUrlCallback() {
  @Override
  public void onCallback(String uri) {
    Log.i("GetDownloadUrlCallback", "Got uri: +uri);
  }
});

См. также:

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