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) {
}
});
}
" Firebase linkRef = firebaseRef.child ("/ posts /" + postId); " Myślę, że używasz starszej wersji interfejsu API Firebase; Czy mam rację? –
Skorzystaj z tego dokumentu i wypróbuj go w nowym interfejsie API bazy danych Firebase; "https://firebase.google.com/docs/database/android/start/"; –