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的最后一部分,我已经在其中解释了如何使用自定义回调来完成。您还可以查看此,以便更好地理解