如何从Firebase检索列表避免异步

时间:2018-07-08 03:01:49

标签: android firebase firebase-realtime-database

我知道,当我们从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) {

        }
    });

2 个答案:

答案 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节点的数据一次。