Как указал zgc7009, проблема возникает из-за асинхронного вызова, когда вы вызываете
uploadImageToFirebaseStorage();
, вы предполагаете, что метод вернется после загрузки изображения и установки URL-адреса на profileImageUrl
, но нет, он возвращается сразу после установки ваших слушателей, затем управление достигает if(profileImageUrl== null)
, что верно, потому что изображение еще не загружено, и ваш обратный вызов слушателя не выполняется для установки profileImageUrl
, тогда управление достигает if(user != null && profileImageUrl != null)
что является ложным по той же причине, так что теперь вы получаете это, правильно?
FIX
если я не ошибаюсь, вы хотите показать новое изображение пользователя, когда он меняется профиль, но это может произойти только при загрузке изображения, что означает выполнение onSuccessLisener()
на putFile()
, что означает, что код зависит от обратного вызова, поэтому переместите его в обратный вызов.
Переместите код из saveInfo()
to uploadImageToFirebaseStorage();
вот так
private void uploadImageToFirebaseStorage () {final StorageReference profileImageRef = FirebaseStorage.getInstance (). getReferen ce ("profilepi c" + System.currentTimeMillis () + ". jpg");
if(uriProfile != null){
progressbar.setVisibility(View.VISIBLE);
profileImageRef.putFile(uriProfile)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
progressbar.setVisibility(View.GONE);
//profileImageUrl = profileImageRef.getDownloadUrl().toString();
profileImageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
profileImageUrl = uri.toString();
FirebaseUser user = mauth.getCurrentUser();
if(user != null){
UserProfileChangeRequest profile = new UserProfileChangeRequest.Builder().
setDisplayName(name).
setPhotoUri(Uri.parse(profileImageUrl)).
build();
user.updateProfile(profile).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
Toast.makeText(profile_activity.this,"Profile updated",Toast.LENGTH_SHORT).show();
}
}
});
}
if (user==null){
Toast.makeText(getApplicationContext(),"User nalla h",Toast.LENGTH_SHORT).show();
}
Toast.makeText(profile_activity.this,"Image upload successfull",Toast.LENGTH_SHORT).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(profile_activity.this,e.getMessage(),Toast.LENGTH_SHORT).show();
}
});
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
progressbar.setVisibility(View.GONE);
Toast.makeText(profile_activity.this,e.getMessage(),Toast.LENGTH_SHORT).show();
}
});
}
}
**note** i removed some `if` conditions because those were guranteed to be true,you will also need to make some variable final because now those are getting used within the inner class
В качестве альтернативы
uploadImageToFirebaseStorage();
сделать этот метод возвращаемым UploadTak
, если вы хотите переместить код из saveInfo
что-то вроде ниже
private Task<UploadTask> uploadImageToFirebaseStorage(){
final StorageReference profileImageRef = FirebaseStorage.getInstance().getReference("profilepic"+System.currentTimeMillis()+".jpg");
if(uriProfile != null){
progressbar.setVisibility(View.VISIBLE);
return profileImageRef.putFile(uriProfile)
}
}
Теперь установите слушателя в saveInfo()
. Я также рекомендую вам взломать код в методы, потому что код теперь выглядит грязно, хорошего дня Himanjli