Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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
Android Firebase数据库未检索数据_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android Firebase数据库未检索数据

Android Firebase数据库未检索数据,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,这是我第一次使用firebase,我有几个方法都包含在同一个类中,它们不能正常工作。nameExists总是返回false,即使我可以在控制台中看到存储在name处的值不是null。userStatus是此类中的DataSnapshot字段 public Boolean nameExists(String name){ if (getUserStatus(name) != null){ return true; } else{ return false; } }

这是我第一次使用firebase,我有几个方法都包含在同一个类中,它们不能正常工作。nameExists总是返回false,即使我可以在控制台中看到存储在name处的值不是null。userStatus是此类中的DataSnapshot字段

public Boolean nameExists(String name){
    if (getUserStatus(name) != null){
        return true;
    } else{ return false; }
}

 public String getUserStatus(String name){
    DatabaseReference tmpRef = FirebaseDatabase.getInstance().getReference().child("userStatuses").child(name);
    ValueEventListener v = new statusesListener();
    tmpRef.addValueEventListener(v);
    tmpRef.removeEventListener(v);
        return userStatus;
}

 private class statusesListener implements ValueEventListener{

    public void onDataChange(DataSnapshot snap){
        userStatus = (String) snap.getValue();
    }
    public void onCancelled(DatabaseError error){
    }

}

感谢您的帮助

您忽略了
ValueEventListener
回调的异步特性。添加侦听器时,通常需要先从Firebase服务器获取值,然后才能通过
onDataChange()
回调提供该值。回调以异步方式启动,通常在添加侦听器后的许多毫秒内启动

在代码中,
getUserStatus()
添加
statusesListener
,然后删除它并返回
userStatus
。所有这些都发生在激发
onDataChage()
之前,因此
userStatus
的值保持不变


另外,添加并立即删除
ValueEventListener
不是典型的用例,并且,考虑到侦听器的异步性质,可能会导致它永远不会启动。最好使用添加侦听器,这会给您一次值,并且不需要删除侦听器。

但我只需要检索一次数据,我担心这会在添加侦听器后检索数据,然后在值更改时再次检索数据。如果更新userStatus需要几毫秒的时间,我如何知道在尝试使用userStatus值之前需要等待多长时间,我如何实现此延迟,以及我如何验证userStatus是否已实际更新,用户是否刚刚失去了internet连接或出现了一些奇怪的情况。还有,为什么Google的Firebase指南中没有这个概念?这就像是一个需要添加的重要注释,应该给出一个解决方法。使用
addListenerForSingleEvent()
添加的侦听器只触发一次,不用于更改。这在标题为“一次读取数据”的部分中进行了描述。关于延迟和等待,您的设计必须是事件驱动的。假设您的代码在主(UI)线程上运行,您不能阻止等待异步响应。那么,如果我不知道何时检索到检索到的数据,我该如何使用检索到的数据?不管怎样,我想我已经通过使用ASyncTask等待响应解决了这个问题。