2017-01-10 1 views
2

Firebase의 데이터베이스를 많이 사용하는 Android 앱을 제작하고 있습니다.Firebase 데이터베이스 Android - 다중 ValueEventListeners의 스냅 샷 검색 순서

데이터베이스에는 RootNode이라는 노드가 있으며 여기에는 100 개의 자식 노드가 있습니다. 의 각 하위 노드 인 RootNode에는 고유 한 키 - 값 속성이있는 자체 하위 노드 (30-60 개)가 있습니다. 따라서 하위 노드 당 상당량의 데이터를 처리합니다.

클라이언트 측에서는 의 모든 하위 키를 가지고 있는데List<String> list에 저장되어 있습니다. 이 목록을 반복하면서 각 자식에 ValueEventListener를 추가합니다 (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. 
      } 
     }); 
    } 

그리고 이것은 콘솔 출력 :

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

즉답에 대한 답변을 부탁드립니다! 주제를 자세히 연구하고 파이프 라이닝에 대해 더 많은 것을 배울 수있는 견고한 토대가되었습니다. 좋은 일을 계속 지켜라. –

관련 문제