使用updateChildren时在Firebase实时数据库中调用侦听器的顺序

时间:2017-12-14 03:59:47

标签: android firebase firebase-realtime-database

我们说我在数据库上有两个节点(nodeAnodeB)并且我在这些节点上附加了两个侦听器:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();    
rootRef.child(nodeApath).addChildEventListener(listenerA);
rootRef.child(nodeBpath).addValueEventListener(listenerB);

我正在使用updateChildren

同时更新两个节点
Map<String, Object> properties = new HashMap<>();
properties.put(nodeApath, valueA);
properties.put(nodeBpath, valueB);
rootRef.updateChildren(properties);

在这种情况下,首先调用哪个侦听器?我知道Firebase使用单个套接字连接/流水线操作,并按照更新顺序发送结果,但在updateChildren的情况下,多个节点同时更新,那么Firebase如何更新处理那个?

如何确保首先调用特定的侦听器(例如listenerA)?

1 个答案:

答案 0 :(得分:2)

您不应该依赖于传递给Firebase实时数据库SDK的任何侦听器顺序。如果需要可预测的排序,请创建一个聚合侦听器,以完全按照您想要的顺序调用回调。它可能是这样的:

public class OrderedValueEventListener implements ValueEventListener {
    private ArrayList<ValueEventListener> orderedListeners;
    public OrderedValueEventListener(List<ValueEventListener> listeners) {
        orderedListeners = new ArrayList<>(listeners);
    }

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (ValueEventListener listener : orderedListeners) {
            listener.onDataChange(dataSnapshot);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        for (ValueEventListener listener : orderedListeners) {
            listener.onCancelled(databaseError);
        }
    }
}

然后创建此侦听器的实例,将您想要按顺序调用的其他侦听器的列表传递给您感兴趣的Query或DatabaseReference。

如果您希望在子级和值侦听器之间进行排序,我不相信SDK会给您任何保证,并且实现可能随时更改,因为从未在文档中定义排序。