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

时间:2018-08-02 18:52:02

标签: 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);
    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;
    }
}

3 个答案:

答案 0 :(得分:1)

ValueEventListener是异步的,因此不会先运行。该函数不会等待侦听器获取值。相反,请尝试在从onDataChange()函数内部获取返回值之后调用执行所需功能的函数。

答案 1 :(得分:0)

您不能将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) {

    }
});



}

答案 2 :(得分:0)

Firebase API为asynchronous,这意味着onDataChange()方法在调用后立即返回,并且它返回的Task中的回调将在一段时间后调用。无法保证需要多长时间。该数据可用并可以使用之前,可能需要几百毫秒到几秒钟的时间。由于该方法会立即返回,因此您尚未尝试从groupNam方法之外使用它的onDataChange()变量的值。

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

对此问题的快速解决方案是将以下内容设为statatemnt:

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

onDataChange()方法内部,可以肯定地工作,否则,建议您从 post 看我的答案的最后一部分,在其中我已经解释了如何实现使用自定义回调完成。您也可以查看此 video 以获得更好的理解。