Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting variable inside onDataChange in Firebase (singleValue Listener)

This is just an example of what my code is like. Right now, if I print out the userName variable inside onDataChange, it works fine. But if I try printing userName outside, after the listener, it will print 'null'. How would I be able to store a variable, with the data I want, inside onDataChange()?

public class FireBaseTest extends .... {

    String userName;

    ...

    mDatabase.child("Users").child(key).addListenerForSingleValueEvent(
                    new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            // Get user value
                            userName = dataSnapshot.child("userName").getValue(String.class);
                            System.out.println(userName); //Not null
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                        }
                    });


    ...

    System.out.println(userName); //Null

EDIT/UPDATE: So before I had a process that would take the value that was being listened and do something with it. I just made some adjustments to that process and added it in the onDataChanged method just to end my suffering. Even though it's not entirely satisfying, it worked. Thank you to all who answered.

like image 885
SaltySea Avatar asked Jan 06 '23 11:01

SaltySea


1 Answers

Listeners in Firebase are asynchronous, so you can not set a variable like that. You should pass a callback function in the function where you have declared your listener.

This callback function will then take the result from firebase call and do further processing on it.

public void doSomething(@NotNull final Callback callback) {

    final Query query = mDatabase.child(FirebaseConstants.TARGET);

    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String userName = dataSnapshot.child("userName").getValue(String.class);
            callback.OnComplete(userName);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}
like image 84
Ishank Gulati Avatar answered Jan 08 '23 01:01

Ishank Gulati