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.
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) {
}
});
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With