Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何等待侦听器从Android Studio中的Firebase读取数据?_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 如何等待侦听器从Android Studio中的Firebase读取数据?

Java 如何等待侦听器从Android Studio中的Firebase读取数据?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我们正在构建一个Android应用程序,我们的数据库在Firebase上。我想从数据库中读取数据(假设将其存储在全局字符串变量sampleString中),并在整个代码中使用它。但是,当我使用监听器时,我只能在监听器内部使用sampleString。当我试图从代码中的其他位置访问它时,它总是返回null 我希望我的函数sampleFunction仅在侦听器从数据库读取值后调用。在sampleFunction也读取数据库的情况下,它只在我将整个函数复制粘贴到侦听器中时才起作用,如果我只是在侦听器中

我们正在构建一个Android应用程序,我们的数据库在Firebase上。我想从数据库中读取数据(假设将其存储在全局字符串变量sampleString中),并在整个代码中使用它。但是,当我使用监听器时,我只能在监听器内部使用sampleString。当我试图从代码中的其他位置访问它时,它总是返回null

我希望我的函数sampleFunction仅在侦听器从数据库读取值后调用。在sampleFunction也读取数据库的情况下,它只在我将整个函数复制粘贴到侦听器中时才起作用,如果我只是在侦听器中调用该函数,它就不起作用,因为sampleString的值保持为null。在调用sampleFunction之前,我尝试放置一个等待函数,但它仍然不起作用。每当我需要使用时,复制粘贴相同的函数会使代码变得一团糟。我怎样才能解决这个问题

代码:


那个么,如何让sampleFunction等待sampleString从数据库加载数据呢?如果我将sampleFunction复制粘贴到main,代码就可以工作,但是我必须多次这样做,代码看起来很糟糕。

数据库操作是异步的,这意味着您通常不会让任何其他函数等待它完成。特别是当另一个函数在主线程上运行时。不要阻塞主线程

此外,您可能希望使用而不是,因为前者仅在找到数据时触发一次,而后者将持续侦听更改,并在添加侦听器后触发每个新更改

您可以通过在回调中调用另一个函数而不是深入嵌套回调来重新构造代码。这将使它更易于阅读。

在从数据库获取所有数据后,您可以添加回调(侦听器),然后可以将其转发到需要的地方。
String sampleString;
Boolean isSame;

void sampleFunction() {
    myAnotherRef.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        sampleString2 = dataSnapshot.child("name").getValue().toString();
                        same = sampleString.equals(sampleString2); //returns false because sampleString always seems null.
                    }

                    //...

    }                       

}

void main(){
    myRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    sampleString = dataSnapshot.child("name").getValue().toString();
                    sampleFunction();
                    if(isSame){ //returns false because in sampleFunction, sampleString always seems null.
                        //...
                    }
                }

                //...
    }

    //...  
}