android - Firebase Database Android - 来自多个 ValueEventListeners 的快照检索顺序

标签 android firebase firebase-realtime-database

我正在构建一个大量使用 Firebase 数据库的 Android 应用。

在数据库中,我有一个名为 RootNode 的节点,它包含 100 个子节点。 RootNode 的每个子节点都有自己的子节点(每个子节点有 30 到 60 个),每个子节点都有自己的键值属性(因此,我们正在谈论每个子节点的大量数据)。

客户端,我将 RootNode 的所有子节点的 key 存储在 List<String> list 中.通过遍历此列表,我向 RootNode 的每个子节点添加了一个 ValueEventListener。

// Loop through the children of RootNode.
for (final String keyOfChildNode: list) { // list contains the keys of all the children nodes of RootNode.
        Log.d(TAG, "Adding ValueEventListener to child node: " + keyOfChildNode);
        // Set a ValueEventListener to child node. 
        RootNodeReference.child(keyOfChildNode).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                // Datasnapshot of child has been retrieved.
                Log.d(TAG, "Datasnapshot retrieved for child node: " + keyOfChildNode);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                // Report error.
            }
        });
    }

这是控制台输出:

Adding ValueEventListener to child node:    keyChildNode001
Adding ValueEventListener to child node:    keyChildNode002
Adding ValueEventListener to child node:    keyChildNode003
Adding ValueEventListener to child node:    keyChildNode004
Adding ValueEventListener to child node:    keyChildNode005
Adding ValueEventListener to child node:    keyChildNode006
Adding ValueEventListener to child node:    keyChildNode007
Adding ValueEventListener to child node:    keyChildNode008
Adding ValueEventListener to child node:    keyChildNode009
Adding ValueEventListener to child node:    keyChildNode010
Adding ValueEventListener to child node:    keyChildNode011
Adding ValueEventListener to child node:    keyChildNode012
Adding ValueEventListener to child node:    keyChildNode013
Adding ValueEventListener to child node:    keyChildNode014
Adding ValueEventListener to child node:    keyChildNode015
Adding ValueEventListener to child node:    keyChildNode016
Adding ValueEventListener to child node:    keyChildNode017
Adding ValueEventListener to child node:    keyChildNode018
Adding ValueEventListener to child node:    keyChildNode019
Adding ValueEventListener to child node:    keyChildNode020
Adding ValueEventListener to child node:    keyChildNode021
Adding ValueEventListener to child node:    keyChildNode022
Adding ValueEventListener to child node:    keyChildNode023
Adding ValueEventListener to child node:    keyChildNode024
Adding ValueEventListener to child node:    keyChildNode025
Adding ValueEventListener to child node:    keyChildNode026
Adding ValueEventListener to child node:    keyChildNode027
Adding ValueEventListener to child node:    keyChildNode028
Adding ValueEventListener to child node:    keyChildNode029
Adding ValueEventListener to child node:    keyChildNode030
Adding ValueEventListener to child node:    keyChildNode031
Adding ValueEventListener to child node:    keyChildNode032
Adding ValueEventListener to child node:    keyChildNode033
Adding ValueEventListener to child node:    keyChildNode034
Adding ValueEventListener to child node:    keyChildNode035
Adding ValueEventListener to child node:    keyChildNode036
Adding ValueEventListener to child node:    keyChildNode037
Adding ValueEventListener to child node:    keyChildNode038
Adding ValueEventListener to child node:    keyChildNode039
Adding ValueEventListener to child node:    keyChildNode040
Adding ValueEventListener to child node:    keyChildNode041
Adding ValueEventListener to child node:    keyChildNode042
Adding ValueEventListener to child node:    keyChildNode043
Adding ValueEventListener to child node:    keyChildNode044
Adding ValueEventListener to child node:    keyChildNode045
Adding ValueEventListener to child node:    keyChildNode046
Adding ValueEventListener to child node:    keyChildNode047
Adding ValueEventListener to child node:    keyChildNode048
Adding ValueEventListener to child node:    keyChildNode049
Adding ValueEventListener to child node:    keyChildNode050
Adding ValueEventListener to child node:    keyChildNode051
Adding ValueEventListener to child node:    keyChildNode052
Adding ValueEventListener to child node:    keyChildNode053
Adding ValueEventListener to child node:    keyChildNode054
Adding ValueEventListener to child node:    keyChildNode055
Adding ValueEventListener to child node:    keyChildNode056
Adding ValueEventListener to child node:    keyChildNode057
Adding ValueEventListener to child node:    keyChildNode058
Adding ValueEventListener to child node:    keyChildNode059
Adding ValueEventListener to child node:    keyChildNode060
Adding ValueEventListener to child node:    keyChildNode061
Adding ValueEventListener to child node:    keyChildNode062
Adding ValueEventListener to child node:    keyChildNode063
Adding ValueEventListener to child node:    keyChildNode064
Adding ValueEventListener to child node:    keyChildNode065
Adding ValueEventListener to child node:    keyChildNode066
Adding ValueEventListener to child node:    keyChildNode067
Adding ValueEventListener to child node:    keyChildNode068
Adding ValueEventListener to child node:    keyChildNode069
Adding ValueEventListener to child node:    keyChildNode070
Adding ValueEventListener to child node:    keyChildNode071
Adding ValueEventListener to child node:    keyChildNode072
Adding ValueEventListener to child node:    keyChildNode073
Adding ValueEventListener to child node:    keyChildNode074
Adding ValueEventListener to child node:    keyChildNode075
Adding ValueEventListener to child node:    keyChildNode076
Adding ValueEventListener to child node:    keyChildNode077
Adding ValueEventListener to child node:    keyChildNode078
Adding ValueEventListener to child node:    keyChildNode079
Adding ValueEventListener to child node:    keyChildNode080
Adding ValueEventListener to child node:    keyChildNode081
Adding ValueEventListener to child node:    keyChildNode082
Adding ValueEventListener to child node:    keyChildNode083
Adding ValueEventListener to child node:    keyChildNode084
Adding ValueEventListener to child node:    keyChildNode085
Adding ValueEventListener to child node:    keyChildNode086
Adding ValueEventListener to child node:    keyChildNode087
Adding ValueEventListener to child node:    keyChildNode088
Adding ValueEventListener to child node:    keyChildNode089
Adding ValueEventListener to child node:    keyChildNode090
Adding ValueEventListener to child node:    keyChildNode091
Adding ValueEventListener to child node:    keyChildNode092
Adding ValueEventListener to child node:    keyChildNode093
Adding ValueEventListener to child node:    keyChildNode094
Adding ValueEventListener to child node:    keyChildNode095
Adding ValueEventListener to child node:    keyChildNode096
Adding ValueEventListener to child node:    keyChildNode097
Adding ValueEventListener to child node:    keyChildNode098
Adding ValueEventListener to child node:    keyChildNode099
Adding ValueEventListener to child node:    keyChildNode100
Datasnapshot retrieved for child node:  keyChildNode001
Datasnapshot retrieved for child node:  keyChildNode002
Datasnapshot retrieved for child node:  keyChildNode003
Datasnapshot retrieved for child node:  keyChildNode004
Datasnapshot retrieved for child node:  keyChildNode005
Datasnapshot retrieved for child node:  keyChildNode006
Datasnapshot retrieved for child node:  keyChildNode007
Datasnapshot retrieved for child node:  keyChildNode008
Datasnapshot retrieved for child node:  keyChildNode009
Datasnapshot retrieved for child node:  keyChildNode010
Datasnapshot retrieved for child node:  keyChildNode011
Datasnapshot retrieved for child node:  keyChildNode012
Datasnapshot retrieved for child node:  keyChildNode013
Datasnapshot retrieved for child node:  keyChildNode014
Datasnapshot retrieved for child node:  keyChildNode015
Datasnapshot retrieved for child node:  keyChildNode016
Datasnapshot retrieved for child node:  keyChildNode017
Datasnapshot retrieved for child node:  keyChildNode018
Datasnapshot retrieved for child node:  keyChildNode019
Datasnapshot retrieved for child node:  keyChildNode020
Datasnapshot retrieved for child node:  keyChildNode021
Datasnapshot retrieved for child node:  keyChildNode022
Datasnapshot retrieved for child node:  keyChildNode023
Datasnapshot retrieved for child node:  keyChildNode024
Datasnapshot retrieved for child node:  keyChildNode025
Datasnapshot retrieved for child node:  keyChildNode026
Datasnapshot retrieved for child node:  keyChildNode027
Datasnapshot retrieved for child node:  keyChildNode028
Datasnapshot retrieved for child node:  keyChildNode029
Datasnapshot retrieved for child node:  keyChildNode030
Datasnapshot retrieved for child node:  keyChildNode031
Datasnapshot retrieved for child node:  keyChildNode032
Datasnapshot retrieved for child node:  keyChildNode033
Datasnapshot retrieved for child node:  keyChildNode034
Datasnapshot retrieved for child node:  keyChildNode035
Datasnapshot retrieved for child node:  keyChildNode036
Datasnapshot retrieved for child node:  keyChildNode037
Datasnapshot retrieved for child node:  keyChildNode038
Datasnapshot retrieved for child node:  keyChildNode039
Datasnapshot retrieved for child node:  keyChildNode040
Datasnapshot retrieved for child node:  keyChildNode041
Datasnapshot retrieved for child node:  keyChildNode042
Datasnapshot retrieved for child node:  keyChildNode043
Datasnapshot retrieved for child node:  keyChildNode044
Datasnapshot retrieved for child node:  keyChildNode045
Datasnapshot retrieved for child node:  keyChildNode046
Datasnapshot retrieved for child node:  keyChildNode047
Datasnapshot retrieved for child node:  keyChildNode048
Datasnapshot retrieved for child node:  keyChildNode049
Datasnapshot retrieved for child node:  keyChildNode050
Datasnapshot retrieved for child node:  keyChildNode051
Datasnapshot retrieved for child node:  keyChildNode052
Datasnapshot retrieved for child node:  keyChildNode053
Datasnapshot retrieved for child node:  keyChildNode054
Datasnapshot retrieved for child node:  keyChildNode055
Datasnapshot retrieved for child node:  keyChildNode056
Datasnapshot retrieved for child node:  keyChildNode057
Datasnapshot retrieved for child node:  keyChildNode058
Datasnapshot retrieved for child node:  keyChildNode059
Datasnapshot retrieved for child node:  keyChildNode060
Datasnapshot retrieved for child node:  keyChildNode061
Datasnapshot retrieved for child node:  keyChildNode062
Datasnapshot retrieved for child node:  keyChildNode063
Datasnapshot retrieved for child node:  keyChildNode064
Datasnapshot retrieved for child node:  keyChildNode065
Datasnapshot retrieved for child node:  keyChildNode066
Datasnapshot retrieved for child node:  keyChildNode067
Datasnapshot retrieved for child node:  keyChildNode068
Datasnapshot retrieved for child node:  keyChildNode069
Datasnapshot retrieved for child node:  keyChildNode070
Datasnapshot retrieved for child node:  keyChildNode071
Datasnapshot retrieved for child node:  keyChildNode072
Datasnapshot retrieved for child node:  keyChildNode073
Datasnapshot retrieved for child node:  keyChildNode074
Datasnapshot retrieved for child node:  keyChildNode075
Datasnapshot retrieved for child node:  keyChildNode076
Datasnapshot retrieved for child node:  keyChildNode077
Datasnapshot retrieved for child node:  keyChildNode078
Datasnapshot retrieved for child node:  keyChildNode079
Datasnapshot retrieved for child node:  keyChildNode080
Datasnapshot retrieved for child node:  keyChildNode081
Datasnapshot retrieved for child node:  keyChildNode082
Datasnapshot retrieved for child node:  keyChildNode083
Datasnapshot retrieved for child node:  keyChildNode084
Datasnapshot retrieved for child node:  keyChildNode085
Datasnapshot retrieved for child node:  keyChildNode086
Datasnapshot retrieved for child node:  keyChildNode087
Datasnapshot retrieved for child node:  keyChildNode088
Datasnapshot retrieved for child node:  keyChildNode089
Datasnapshot retrieved for child node:  keyChildNode090
Datasnapshot retrieved for child node:  keyChildNode091
Datasnapshot retrieved for child node:  keyChildNode092
Datasnapshot retrieved for child node:  keyChildNode093
Datasnapshot retrieved for child node:  keyChildNode094
Datasnapshot retrieved for child node:  keyChildNode095
Datasnapshot retrieved for child node:  keyChildNode096
Datasnapshot retrieved for child node:  keyChildNode097
Datasnapshot retrieved for child node:  keyChildNode098
Datasnapshot retrieved for child node:  keyChildNode099
Datasnapshot retrieved for child node:  keyChildNode100

有一件事让我感到惊讶:由于添加到子引用的 ValueEventListeners 本质上是异步的,我预计快照将以随机顺序检索(不一定与 ValueEventListeners 的顺序相同)添加)。但控制台输出显示快照是按照将 ValueEventListeners 添加到每个子节点的顺序检索的。

以这种“有序”的方式检索快照是否正常?如果是,考虑到监听器的异步性质,这怎么可能?提前谢谢你。

最佳答案

这确实是预期的行为。

Firebase 数据库客户端通过单个套接字连接与其服务器进行通信。此套接字用于客户端和数据库服务器之间的所有通信。

当您请求 100 条记录时,所有请求都按照您进行调用的顺序通过这个单一连接发送。然后服务器以相同的顺序执行请求并以相同的顺序返回结果。

这称为流水线:通过单个连接发送多个请求并按顺序返回结果。我之前在这里回答了更多:Speed up fetching posts for my social network app by using query instead of observing a single event repeatedly

关于android - Firebase Database Android - 来自多个 ValueEventListeners 的快照检索顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41572610/

相关文章:

Android 每隔 n 毫秒播放一次提示音

javascript - 如何确保云函数中的所有操作都顺利完成?

swift - Firebase 说我的规则不安全,为什么?

android - 规则条目重复 firebase 不工作

ios - 如何从另一个 child 查询一个 child 。火力地堡( swift )

ios - 如何防止用户多次发帖?

android - Android Studio 3.1.4卡在gradle构建中运行

android - 不受支持的记录版本Unknown-2.0 android studio

Android谷歌地图,谷歌地点,北纬超过南纬

swift - StorageMetadata' 没有成员 'downloadURL'