Java Firebase数据库检索未按顺序执行

Java Firebase数据库检索未按顺序执行,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我试图在我的数据库中检索一个子项,这样用户就可以加入一个组。但是,当我执行该方法时,它会给我一个NullPointerException,因为它首先返回,我如何让它先进入检索 public int groupCheck(String GrN, String Pass) { final String GN = GrN; DatabaseReference myRef = database.getReference("GROUPS").child("GROUP").child(GN

我试图在我的数据库中检索一个子项,这样用户就可以加入一个组。但是,当我执行该方法时,它会给我一个
NullPointerException
,因为它首先返回,我如何让它先进入检索

public int groupCheck(String GrN, String Pass) {
    final String GN = GrN;

    DatabaseReference myRef = database.getReference("GROUPS").child("GROUP").child(GN);
    myRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            groupNam = dataSnapshot.getValue().toString();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });


    if (groupNam.equals(GroupN)) {
        return 1;
    } else {
        return 0;
    }
}

ValueEventListeners是异步的,因此它们不会首先运行。函数不会等待侦听器获取值。相反,在从
onDataChange()
函数内部获取返回值后,尝试调用执行所需操作的函数。

您不能将firebase数据添加到全局变量。您应该在onDataChange方法内部工作

public void groupCheck(String GrN, String Pass) {

final String GN = GrN;

DatabaseReference myRef = database.getReference("GROUPS").child("GROUP").child(GN);
myRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        groupNam = dataSnapshot.getValue().toString();

          if (groupNam.equals(GroupN)) {

         ////Do something. You can't return.

          } else {

           ////Do something. You can't return.

          }

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});



}

Firebase API是
异步的
,这意味着
onDataChange()
方法在调用后立即返回,它返回的任务的回调将在稍后调用。无法保证需要多长时间。可能需要几百毫秒到几秒钟的时间,数据才可用并可以使用。由于该方法立即返回,因此在
onDataChange()
方法外部尝试使用的
groupNam
变量的值尚未从回调中填充

基本上,您尝试从异步API同步返回一个值。那不是个好主意。您应该按照预期异步处理API

此问题的一个快速解决方法是在StateMnt中移动以下内容:

if (groupNam.equals(GroupN)) {
    return 1;
} else {
    return 0;
}
onDataChange()
方法中,它肯定会起作用,否则我建议您查看我的anwser的最后一部分,我已经在其中解释了如何使用自定义回调来完成。您还可以查看此,以便更好地理解