在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
并调用其中一个或多个方法onDataChanged
或onDataChanged
。
也就是说,打印userName
变量可能会显示一个值,也可能不会,这取决于是否在打印之前触发了回调。
因此,这是一种非常自然的行为,因为代码一次只会占用一行。
这是我经常发现Firebase很棘手的事情。 我建议的唯一真正的解决方案是确保您需要访问Firebase变量的任何代码是:
1)在onDataChange方法中。
2)只有在addListenerForSingleValueEvent onDataChange方法完成后才调用/访问。
- Firebase列表适配器构造函数错误
- 如何将Firebase RecyclerView放在另一个RecyclerView中
- 如何获取父节点的值作为字符串?
- JsonMappingException:找不到合适的构造函数
- 如何检查firebase数据库中是否存在值 – android
- Firestore查询文档startswith一个字符串
- 如何从android中的firebase数据库中获取随机对象?
- 如何在RecyclerView项中的populateViewHolder中设置addSnapshotListener并删除?
- StorageException:代码:-13000 HttpResult:0将文件上传到Firebase