Java 布尔值在活动中第一次返回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

我有一个方法,如果数据库中存在子对象,则返回true,否则返回false。看起来是这样的:

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
,或者实现自定义回调。好的,谢谢。你知道我如何解决这个问题吗?我的建议是不要把它变成一个函数,否则使用这个代码,在这个函数返回的基础上做其他逻辑。如果您正在基于此函数结果执行某些操作,请将所有这些逻辑写入此函数回调中。