2017-01-10 94 views
2

我正在构建大量使用Firebase数据库的Android应用程序。Firebase数据库Android - 多个ValueEventListeners的快照检索顺序

在数据库中,我有一个节点,名为RootNode其中包含100个子节点。 RootNode的每个孩子都有自己的孩子(每个孩子30到60个),每个孩子都有自己的键值属性(所以我们说的是每个孩子节点的大量数据)。

客户端,我有RootNode存储在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添加到每个子节点的顺序检索快照。

以这种“有序”方式检索快照是否正常?如果是的话,鉴于听众的异步性质,怎么可能?先谢谢你。

回答

4

这确实是预期的行为。

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

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

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

+0

谢谢你的粉扑立即回答!它为我进一步研究该主题并了解更多关于流水线的知识奠定了坚实的基础。保持良好的工作。 –