2017-09-25 44 views
1

我想从里面火力地堡取数据,以检查该用户是否在数据库中存在,但有我解决不了的问题,听众触发迟到,这是我的代码: -获取数据

  • 如果我删除while循环,我不能获取对象快速
  • 如果我继续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); 
    } 
    
+0

你不告诉你是如何触发事件。 while循环阻塞线程有没有机会?您需要从另一个线程触发事件。并且不要用一段时间以100%运行。您的监听器可以添加到队列中,而且您可以在项目添加到队列时记录日志。 –

+0

数据是从Firebase异步加载的。你不能从(常规,同步)函数中返回它。见https://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener –

+0

所以你建议让主线程等待足够的时间,听者触发?我已经试过这个解决方案,但没有锻炼第一次我打电话功能抓取是空的第二次它不是空 –

回答

0

Firebase必须从数据库中提取数据并将其放入您的应用中。这可能需要时间,因此应该在后台完成。当您添加valueEventListener时,抓取将在后台完成。你可能会显示一个进度条,显示数据仍然加载,一旦数据在手,做的代码的其余部分:

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