Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我得到;空";当我试图从firebase方法中的内部类访问变量时_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 我得到;空";当我试图从firebase方法中的内部类访问变量时

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() {

我试图获取一个内部类中的变量的值,该变量被firebase“addValueEventListener”覆盖,但当我试图在这些方法之外打印出值时,我总是得到“NULL”。这是我的代码:

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之前执行是的,这就是问题所在,我已经解决了,非常感谢