这是我第一次使用Firebase,并且我有一些方法都包含在同一个类中,这些方法无法正常工作。即使我在控制台中看到存储在name处的值不为null时,nameExists始终返回false。 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并不是典型的用例,并且鉴于侦听器的异步性质,可能导致其永不触发。最好用Query.addListenerForSingleValueEvent()添加侦听器,这样可以一次性给您提供该值,并且不需要删除该侦听器。

08-18 02:42