在Firebase中设置onDataChange内的变量(singleValue Listener)

这只是我的代码的一个例子。 现在,如果我在onDataChange中打印出userName变量,它可以正常工作。 但是如果我尝试打印userName,在侦听器之后,它将打印’null’。 我怎样才能在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 

编辑/更新:所以在我有一个过程,它将采取正在被听取的价值并做一些事情。 我只是对该过程进行了一些调整,并将其添加到onDataChanged方法中,以结束我的痛苦。 虽然它并不完全令人满意,但它确实奏效了。 谢谢所有回答的人。

Firebase中的监听器是异步的,因此您无法设置这样的变量。 您应该在已声明侦听器的函数中传递回调函数。

然后,此回调函数将从firebase调用获取结果并对其进行进一步处理。

 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) { } }); } 

Firebase事件监听器被执行Asynchrounosly,意思是,它在后台运行,一旦完成,它会使用您在案例中提供的回调通知您ValueEventListener并调用其中一个或多个方法onDataChangedonDataChanged

也就是说,打印userName变量可能会显示一个值,也可能不会,这取决于是否在打印之前触发了回调。

因此,这是一种非常自然的行为,因为代码一次只会占用一行。

这是我经常发现Firebase很棘手的事情。 我建议的唯一真正的解决方案是确保您需要访问Firebase变量的任何代码是:

1)在onDataChange方法中。

2)只有在addListenerForSingleValueEvent onDataChange方法完成后才调用/访问。