我正尝试在数据库中检索一个孩子,以便用户可以加入一个组,但是当我执行此方法时,它会给我一个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;
}
}
答案 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 以获得更好的理解。