这是我第一次使用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()添加侦听器,这样可以一次性给您提供该值,并且不需要删除该侦听器。