Загрузка файла в 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);
}
});
См. также: