I'm building an Android app that heavily uses Firebase's Database.
In the Database, I have a node called RootNode which contains 100 children nodes. Each child of RootNode has its own children (from 30 to 60 each), each with its own key-value properties (so, we're talking a substantial amount of data per child node).
Client-side, I have the keys of all the children of RootNode stored in List<String> list
. By looping through this list, I'm adding a ValueEventListener to each child of RootNode.
// 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.
}
});
}
And this is the console output:
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
One thing surprised me: since the ValueEventListeners added to the child references are asynchronous in nature, I expected that the snapshots would be retrieved in random order (not necessarily in the same order that the ValueEventListeners were added). But the console output shows that the snapshots are retrieved in the order that the ValueEventListeners were added to each child node.
Is it normal that the snapshots were retrieved in this 'orderly' fashion? If yes, how is it possible given the asynchronous nature of the listeners? Thank you in advance.