Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用updateChildren时在Firebase实时数据库中调用侦听器的顺序_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

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

Android 使用updateChildren时在Firebase实时数据库中调用侦听器的顺序,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,假设我在数据库上有两个节点(nodeA和nodeB),我在这些节点上附加了两个侦听器: DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); rootRef.child(nodeApath).addChildEventListener(listenerA); rootRef.child(nodeBpath).addValueEventListener(listenerB); 我正在使用upd

假设我在数据库上有两个节点(
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);
Map properties=newhashmap();
properties.put(nodePath,valueA);
properties.put(nodeBpath,valueB);
rootRef.updateChildren(属性);
在本例中,首先调用哪个侦听器?我知道Firebase使用单套接字连接/管道,并按照更新的顺序发送结果,但是在
updateChildren
的情况下,多个节点同时更新,那么Firebase如何处理


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

您不应该依赖于传递到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);
        }
    }
}
公共类OrderedValueEventListener实现ValueEventListener{ 私有ArrayList orderedListeners; public OrderedValueEventListener(列出侦听器){ orderedListeners=新的ArrayList(侦听器); } @凌驾 公共void onDataChange(DataSnapshot DataSnapshot){ for(ValueEventListener侦听器:orderedListeners){ onDataChange(dataSnapshot); } } @凌驾 已取消的公共void(DatabaseError DatabaseError){ for(ValueEventListener侦听器:orderedListeners){ onCancelled(数据库错误); } } } 然后创建此侦听器的实例,将您希望按顺序调用的其他侦听器的列表传递给您感兴趣的查询或数据库引用

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