Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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 从firebase数据库获取数据_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 从firebase数据库获取数据

Java 从firebase数据库获取数据,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我想从Firebase内部获取数据,以检查数据库中是否存在此用户,但有一个问题我无法解决,listener trigger late这是我的代码:- 如果移除while循环,则无法快速获取对象 若我保持循环,而我进入无限循环,我不知道为什么 为什么不触发 DataSnapshot fetched ; public boolean user_exist(final String user) throws Exception { users.addListenerForSingleValueEve

我想从Firebase内部获取数据,以检查数据库中是否存在此用户,但有一个问题我无法解决,listener trigger late这是我的代码:-

  • 如果移除while循环,则无法快速获取对象
  • 若我保持循环,而我进入无限循环,我不知道为什么 为什么不触发

    DataSnapshot fetched ;
    public boolean user_exist(final String user) throws Exception {
    users.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            fetched = dataSnapshot ;
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
    while (fetched == null){
        Log.e("dbController","not fetched yet");
    }
    return fetched.hasChild(user);
    }
    

Firebase必须从数据库获取数据并将其带到应用程序中。这可能需要时间,因此应该在后台进行。添加valueEventListener时,将在后台完成抓取。您可以显示progressBar以显示数据仍在加载,一旦数据在手中,请执行代码的其余部分:

users.child(user).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            funUserExists();
        } else {
            funNoUser();
        }
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});

Firebase必须从数据库获取数据并将其带到应用程序中。这可能需要时间,因此应该在后台进行。添加valueEventListener时,将在后台完成抓取。您可以显示progressBar以显示数据仍在加载,一旦数据在手中,请执行代码的其余部分:

users.child(user).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            funUserExists();
        } else {
            funNoUser();
        }
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});

您没有显示如何触发事件。while循环是否有可能阻塞线程?您需要从另一个线程触发事件。不要使用100%运行的时间。您的侦听器可以改为添加到队列中,并且您可以在向队列中添加项目时进行日志记录。数据是从Firebase异步加载的。不能从(常规、同步)函数返回它。看到了么,您建议让主线程等待足够长的时间,以便侦听器触发?我已经尝试过这个解决方案,但是第一次调用函数fetched是null第二次它不是null Frank van Puffelen是的,我想这是我的问题,谢谢你没有显示你是如何触发事件的。while循环是否有可能阻塞线程?您需要从另一个线程触发事件。不要使用100%运行的时间。您的侦听器可以改为添加到队列中,并且您可以在向队列中添加项目时进行日志记录。数据是从Firebase异步加载的。不能从(常规、同步)函数返回它。看到了么,您建议让主线程等待足够长的时间,以便侦听器触发?我已经尝试过这个解决方案,但第一次调用函数fetched是null第二次它不是null Frank van Puffelen是的,我想这是我的问题,谢谢