private int getChildSize() {
final List<String> keys = new ArrayList<>();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("profiles");
ref.orderByChild("phoneNumber")
.equalTo(phoneNumber)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot item : dataSnapshot.getChildren()){
keys.add(item.getKey());
Log.d(TAG, "onDataChange: " + keys.size()); // more than 0
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return keys.size(); // return 0;
}
任何想法?
答案 0 :(得分:1)
Firebase调用是异步的,因此您需要结果才能返回,然后才能返回。你可以做的是在calll完成时调用一个方法:
private void getChildSize() {
final List<String> keys = new ArrayList<>();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("profiles");
ref.orderByChild("phoneNumber")
.equalTo(phoneNumber)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot item : dataSnapshot.getChildren()){
keys.add(item.getKey());
Log.d(TAG, "onDataChange: " + keys.size()); // more than 0
}
finishedCounting(keys.size())
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
public void finishedCounting(int size){
//do something with size
}
答案 1 :(得分:0)
拆分该功能:
将您的ValueEventListener
放入一个单独的init函数中,该函数没有返回类型(void)。
并使getChildSize
函数仅返回大小。
由于ValueEventListener
是异步的,因此在调用return语句之前不会分配任何值。