这只是我的代码的一个例子。现在,如果我在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
EDIT / UPDATE: 所以在我有一个过程之前,它将采用正在倾听的价值并用它做一些事情。我只是对该过程进行了一些调整,并将其添加到onDataChanged方法中,以结束我的痛苦。虽然它并不完全令人满意,但它确实奏效了。感谢所有回答的人。
答案 0 :(得分:4)
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) {
}
});
}
答案 1 :(得分:2)
Firebase事件监听器被执行Asynchrounosly,意思是,它在后台运行,一旦完成,它会使用您在案例ValueEventListener
中提供的回调通知您并调用其中一个或多个方法{{1} }或onDataChanged
。
也就是说,打印onCancelled
变量可能会显示一个值,也可能不会,这取决于是否在打印之前触发了回调。
因此,这是一种非常自然的行为,因为代码一次只会占用一行。
答案 2 :(得分:1)
这是我经常发现使用Firebase时遇到的问题。我建议的唯一真正的解决方案是确保您需要访问Firebase变量的任何代码都是:
1)在onDataChange方法中。
2)只有在addListenerForSingleValueEvent onDataChange方法完成后才调用/访问。