我知道,当我们从Firebase检索数据时,它将是异步的,因此通常我会将所有代码放入addChildEventListener
内,例如我想在下面对userList
进行排序的示例。但是我很困惑,如果List确实很大,例如百万用户,那么这意味着方法sortUser(user)
将被调用百万次?谁能向我解释一下,我是Firebase的新手
myRef.child("User").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
User user= dataSnapshot.getValue(User.class);
userList.add(user);
sortUser(userList);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
答案 0 :(得分:1)
您可能应该使用order-by methods检索经过数据排序的服务器端,然后再听一听。
var userRef = firebase.database().ref('posts').orderByChild('Users');
如果我猜对了,您将不需要单独的排序客户端。
您还可以过滤数据。请参考docs
答案 1 :(得分:1)
您当前使用的是ChildEventListener
,这意味着您的onChildAdded
将立即被每个子节点调用,然后在添加新的子节点时被调用。确实可能有很多调用。
如果您使用ValueEventListener
,则其onDataChange
仅会为初始数据(无论有多少个子节点)被调用一次,然后为每次更改被调用一次。
通过在当前设置中添加ValueEventListener
,可以使事情变得简单:将子节点添加到灯光中,就像您已经在做的那样,但只能在onDataChange
中排序。
myRef.child("User").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
sortUser(userList);
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
};
即使您有两个侦听器,Firebase也会仅同步User
节点的数据一次。