Java 布尔值在活动中第一次返回false
我有一个方法,如果数据库中存在子对象,则返回true,否则返回false。看起来是这样的:Java 布尔值在活动中第一次返回false,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我有一个方法,如果数据库中存在子对象,则返回true,否则返回false。看起来是这样的: boolean subscriber; public boolean checkChatRoomMembership(String chatRoomUid) { mChatRoomMembers.child(chatRoomUid).addValueEventListener(new ValueEventListener() { @Override public v
boolean subscriber;
public boolean checkChatRoomMembership(String chatRoomUid) {
mChatRoomMembers.child(chatRoomUid).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChild(mAuth.getUid())) {
subscriber = true;
} else {
subscriber = false;
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return subscriber;
}
即使该节点存在于数据库中,它在第一次运行该方法时也返回false。接下来的几次,它将按其应该的方式返回true。活动总是在第一次启动时返回false。知道为什么吗?当函数第一次被调用时,函数内部的回调没有被调用。但数据不会被检索,函数返回“subscriber”变量的默认值。在第一次调用此函数之后,当调用回调时,“subscriber”值将更新
public void checkChatRoomMembership(String chatRoomUid) {
mChatRoomMembers.child(chatRoomUid).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChild(mAuth.getUid())) {
// true, do you work here
} else {
// false, do you work here
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
希望这会对您有所帮助。您可能在操作完成之前返回它,因为它是异步的,您现在无法返回尚未完成加载的内容。因此,您需要将需要数据的代码移动到
onDataChange
,或者实现自定义回调。好的,谢谢。你知道我如何解决这个问题吗?我的建议是不要把它变成一个函数,否则使用这个代码,在这个函数返回的基础上做其他逻辑。如果您正在基于此函数结果执行某些操作,请将所有这些逻辑写入此函数回调中。