2017-10-18 2 views
0

J'ai une application qui, à un moment donné, récupère une variable de la base de données Firebase en utilisant la méthode Query#addListenerForSingleValueEvent(). Le code est le suivant:Obtenir un accès à une variable après que onDataChange l'ait récupéré

void initCurrentUserProfile() { 
    mAuth = FirebaseAuth.getInstance(); 
    mUser = mAuth.getCurrentUser(); 
    mFirebaseDatabase = FirebaseDatabase.getInstance(); 

    DatabaseReference userProfileReference = mFirebaseDatabase.getReference().child("users"); 
    userProfileReference = userProfileReference.child(mUser.getUid()); 

    Query userProfileQuery = userProfileReference.orderByKey(); 
    userProfileQuery.addListenerForSingleValueEvent(new ValueEventListener() { 


     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

     // This is the variable that I want to get 
     mUserProfile = dataSnapshot.getValue(UserProfile.class); 
     } 
... 

Je veux obtenir un accès à mUserProfile, qui est une classe avec les données de l'utilisateur tout de suite dans le onCreate() de mon activité et charger l'image dont l'URL est contenue dans cette mUserProfile variable.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    initCurrentUserProfile(); 
    Picasso.with(this).load(Uri.parse(mUserProfile.getProfilePicUrl())).into(mProfilePictureImageView); 
} 

Le problème est, en raison de la nature asynchrone de la base de données Firebase, je ne peux pas le faire et obtenir un NullPointerException:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.grigori.fitnessapp.Profile.UserProfile.getProfilePicUrl()' on a null object reference 

Avez-vous des suggestions quant à ce que je pourrais faire pour avoir accès à cette variable?

Répondre

1

Oui, vous avez besoin d'appeler cette ligne de code:

Picasso.with(this) 
    .load(Uri.parse(mUserProfile.getProfilePicUrl())) 
    .into(mProfilePictureImageView); 

droit dans la méthode onDataChange() et non dans onCreate() méthode sinon il sera toujours nul. Le comportement asynchronous signifie que la ligne ci-dessus est appelée avant que vous essayez d'obtenir les données de la base de données et c'est pourquoi est toujours null.

+0

Merci beaucoup, cela a résolu le problème. –