我试图返回一个布尔值,但返回的值总是false,即在这种情况下为0。
check变量是一个实例变量,按下按钮时会调用下面的函数。
private boolean checkAnswerSubmission() {
DatabaseReference answerDatabase = FirebaseDatabase.getInstance().getReference().child("userPuzzleHistory").child(uid);
answerDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChild(String.valueOf(imagename))) {
check = 1;
} else {
check = 0;
}
//here the value check is working fine but the value cannot be returned from here.
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
//here the value returned is always 0
if (check == 1)
return true;
else
return false;
}
答案 0 :(得分:5)
与所有异步操作一样,我经常以回调方式执行此操作。
您的解决方案可以像这样工作:
创建一个简单的回调界面(我在几乎每个应用程序中使用的库中都有我的)
public interface SimpleCallback {
void callback(Object data);
}
// You could do it as well generic, that's what I do in my lib:
public interface SimpleCallback<T> {
void callback(T data);
}
然后重新设计你方法的签名:
private void checkAnswerSubmission(@NonNull SimpleCallback<boolean> finishedCallback) {
DatabaseReference answerDatabase = FirebaseDatabase.getInstance().getReference().child("userPuzzleHistory").child(uid);
answerDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// This will simple call your callback containing a boolean true/false
finishedCallback.callback(dataSnapshot.hasChild(String.valueOf(imagename)));
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
您可以这样称呼:
checkAnswerSubmission(new SimpleCallback<boolean>() {
@Override
void callback(boolean data) {
if (data) {
// true was returned
} else {
// false was returned
}
}
});
答案 1 :(得分:2)
数据库引用未在运行函数的同一线程上完成。它只是为异步调用添加了一个侦听器,该侦听器仅在从服务器接收数据时才会生成。
所以你的程序初始化一个监听器并转到这一行的下一个语句。
answerDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChild(String.valueOf(imagename))) {
check = 1;
} else {
check = 0;
}
//here the value check is working fine but the value cannot be returned from here.
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
现在由于程序没有等待从它执行的服务器收到响应:
if (check == 1)
return true;
else
return false;
因此,如果您的检查值已初始化,则很可能将0作为值并始终返回false。