Java 全局布尔值在addListenerForSingleEventValue函数中设置,但在下面的if语句中无法识别

Java 全局布尔值在addListenerForSingleEventValue函数中设置,但在下面的if语句中无法识别,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我在firebase中循环查看一些子项,以查看键的值是否存在,并在addListenerForSingleValueEvent函数中找到键,并将全局布尔值设置为true。但是,在函数之后,变量被设置为false,因此程序不会进入第二个if语句 referenceClasses.addListenerForSingleValueEvent(new ValueEventListener() { @Override pub

我在firebase中循环查看一些子项,以查看键的值是否存在,并在addListenerForSingleValueEvent函数中找到键,并将全局布尔值设置为true。但是,在函数之后,变量被设置为false,因此程序不会进入第二个if语句

referenceClasses.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                            if (snapshot.getKey().compareTo(combinedString) == 0) {
                                found = true;
                                break;
                            }
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) { }
                });

                if(found) {
                   //...
                }
我知道通过对数据库的各种输入,addListenerForSingleValueEvent中的find设置为true。布尔值被实例化为

boolean found;

在全局范围内,在任何其他函数之前。我甚至尝试实现两个函数,一个用于设置布尔值,另一个用于返回布尔值,但最终得到的结果是,在addListenerForSingleValueEvent中布尔值为true,在if语句中为false。有什么想法吗?

之所以会发生这种情况,是因为firebase调用是异步的,因此您的程序可能在进入onDataChange()方法之前就碰到了if块。若要查看是否是这种情况,可以在onDataChange中放置一个断点,在if(find)行上放置一个断点,然后查看哪个断点首先被执行

如果您所要做的只是执行一些设置为true的代码,那么您应该将整个If块移动到onDataChange中


希望这有帮助

AvidRP的答案确实是原因:您的
if(found)
现在在
onDataChange
运行之前运行,因此
found
尚未设置。你无法让代码正常工作(或者至少在Android对你的应用不满意的情况下)。但正如我在这里的回答所示,还有其他方法: