Java 我得到;空";当我试图从firebase方法中的内部类访问变量时
我试图获取一个内部类中的变量的值,该变量被firebase“addValueEventListener”覆盖,但当我试图在这些方法之外打印出值时,我总是得到“NULL”。这是我的代码:Java 我得到;空";当我试图从firebase方法中的内部类访问变量时,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我试图获取一个内部类中的变量的值,该变量被firebase“addValueEventListener”覆盖,但当我试图在这些方法之外打印出值时,我总是得到“NULL”。这是我的代码: DatabaseReference reff = database.getReference().child("Users").child(userId); reff.addValueEventListener(new ValueEventListener() {
DatabaseReference reff = database.getReference().child("Users").child(userId);
reff.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User r= dataSnapshot.getValue(User.class);
username= r.getUserN();
//当我在这里打印用户名的值时,它会显示出来
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
DatabaseReference ref = database.getReference().child("service").child(b);
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Service s = dataSnapshot.getValue(Service.class);
servicename=s.getNomservice();
//和用户名一样,我得到值
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
rv = new Rv(username,servicename,dt,tm);
RVId = myRef.push().getKey();
myRef.child(RVId).setValue(rv);
//在这里,当我打印用户名和服务名时,我得到空值您现在不能使用尚未加载的内容。换句话说,您不能简单地在
onDataChange()
方法之外使用username
,因为由于此方法的异步行为,它将始终为null
。这意味着,当您试图在该方法之外打印该结果时,数据尚未从数据库加载完毕,因此无法访问
这个问题的一个快速解决方法是只在
onDataChange()
方法中使用该结果,否则我建议您查看我的anwser的最后一部分,我在其中解释了如何使用自定义回调来完成。您也可以查看此以便更好地理解。网络呼叫是异步的,因此需要一些时间来完成,因此问题是请您快速回答,但我没有理解您所说的。您能解释一下吗?一段时间后,当您收到来自网络呼叫的响应时,将触发侦听,因此在此之前,您将没有任何数据。但是,当我在方法“onDataChange”中添加toast时,确实会得到一个结果,但当toast位于此方法之外时,我不会得到结果,我猜这与内部类有关。参考前面的注释,另外rv=newrv(username,servicename,dt,tm)代码>将在OnDataChange之前执行是的,这就是问题所在,我已经解决了,非常感谢