我们说我在数据库上有两个节点(nodeA
和nodeB
)并且我在这些节点上附加了两个侦听器:
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
)?
答案 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会给您任何保证,并且实现可能随时更改,因为从未在文档中定义排序。