2016-07-20 21 views
11

Mam problem z informacją, kiedy moje połączenie z interfejsem Firebase API zostało zakończone. Po przeczytaniu Firebase documentation Znalazłem następujące:Czy wiesz, kiedy Firebase zakończyło połączenie API?

zdarzenia Wartość zawsze są wyzwalane ostatni i są gwarantowane zawierać nowości od wszelkich innych wydarzeń, które miały miejsce wcześniej, że migawka została podjęta.

Rozumiem to oznaczać, że dopiero po wszystkim wywołanie onChildAdded jest zakończona, wówczas ValueEventListener nazywa. W rezultacie pomyślałem, że mogę zapełnić mój RecyclerView w funkcji onChildAdded, a następnie onSingleValueListener, mogę po prostu zakończyć animację ekranu ładowania (który rozpoczął animację przed wywołaniem tej funkcji) i kontynuować. Jednak natknąłem się na problem, w którym umieszczam ostrożne instrukcje System.out.println i stwierdziłem, że w moim przypadku Test 1 jest wywoływane przed wywołaniem Test 2. Powoduje to problemy, ponieważ w rzeczywistości jest to zachowanie odwrotne od tego, co chciałem: chciałem, aby funkcja onChildAdded zakończyła, a następnie zadzwonił do funkcji onSingleValueListener, która wypisuje Test 1 do wywołania. Czy jest jakikolwiek powód, dlaczego tak się dzieje? Jakikolwiek sposób obejścia tego? Byłbym wdzięczny za wyjaśnienie, dlaczego tak się dzieje. Dzięki!

public void getComments(final String postId, final Activity activity, final View fragmentView, final View progressOverlay) { 
    final Firebase commentsRef = firebaseRef.child("/comments"); 
    Firebase linkRef = firebaseRef.child("/posts/" + postId); 
    linkRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      System.out.println("Test 1"); 
      if (progressOverlay.getVisibility() == View.VISIBLE) { 
       progressOverlay.setVisibility(View.GONE); 
       AndroidUtils.animateView(progressOverlay, View.GONE, 0, 200); 
       fragmentView.findViewById(R.id.rv_view_comments).setVisibility(View.VISIBLE); 
      } 
     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 

     } 
    }); 
    linkRef.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      commentsRef.child(dataSnapshot.getKey()).addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        Comment comment = dataSnapshot.getValue(Comment.class); 
        System.out.println("Test 2"); 
        application.getCommentsRecyclerViewAdapter().getCommentsList().add(comment); 
        application.getCommentsRecyclerViewAdapter().notifyDataSetChanged(); 
       } 

       @Override 
       public void onCancelled(FirebaseError firebaseError) { 

       } 
      }); 
     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 

     } 
    }); 
} 
+0

" Firebase linkRef = firebaseRef.child ("/ posts /" + postId); " Myślę, że używasz starszej wersji interfejsu API Firebase; Czy mam rację? –

+0

Skorzystaj z tego dokumentu i wypróbuj go w nowym interfejsie API bazy danych Firebase; "https://firebase.google.com/docs/database/android/start/"; –

Odpowiedz

4

Z tym kodem "Firebase linkRef = firebaseRef.child("/posts/" + postId);" widziałem, że używasz starszej Firebase API. Jest to przestarzałe!

Uprzejmie zaktualizuj swój kod do nowego interfejsu API Firebase 3.x.x.

Poniżej dwa niezależne połączenia asynchroniczne; Na podstawie Twojego przypadku użycia możesz użyć jednego ze słuchaczy do odczytania danych.

Możesz odnieść się do dokumentu bazy ogniowej, aby uzyskać więcej informacji o modułach nasłuchujących bazy danych. https://firebase.google.com/docs/database/android/retrieve-data

Za pomocą poniższego fragmentu kodu można wyszukać i wypełnić listę komentarzy.

public void getComments(final String postId, final Activity activity, final View fragmentView, final View progressOverlay) { 
    DatabaseReference commentsRef = firebaseRef.child("/comments"); 
    DatabaseReference linkRef = commentsRef.child("/posts/" + postId); 
    linkRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      // Iterate through data-snapshot, and update your Adapter dataset 
      for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
       Comment comment = snapshot.getValue(Comment.class); 
       application.getCommentsRecyclerViewAdapter().getCommentsList().add(comment); 
      } 
      application.getCommentsRecyclerViewAdapter().notifyDataSetChanged(); 

      // Dismiss your loading progressbar 
      if (progressOverlay.getVisibility() == View.VISIBLE) { 
       progressOverlay.setVisibility(View.GONE); 
       AndroidUtils.animateView(progressOverlay, View.GONE, 0, 200); 
       fragmentView.findViewById(R.id.rv_view_comments).setVisibility(View.VISIBLE); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      // Handle fail case here 
     } 
    }); 

Nadzieja to by Ci pomóc!