У меня возникли проблемы с пониманием того, когда мой вызов API Firebase завершен. После чтения Firebase documentation
я нашел следующее:
События события всегда запускаются последними и гарантированно содержат обновления от любых других событий, которые произошли до того, как был сделан снимок.
Я понимаю, это означает, что только после завершения вызова onChildAdded
вызывается ValueEventListener
. В результате я подумал, что могу заполнить свой RecyclerView
в функции onChildAdded
, а затем вызов onSingleValueListener
, я могу просто закончить анимацию моего экрана загрузки (который начал анимацию перед этим вызовом функции) и продолжить. Однако я столкнулся с проблемой, когда я поставил несколько осторожных операторов System.out.println
и обнаружил, что в моем случае Test 1
вызывается до вызова Test 2
. Это вызывает проблемы, потому что это фактически противоположное поведение того, что я хотел: я хотел, чтобы функция onChildAdded
закончила, а затем вызвала функцию onSingleValueListener
, которая выводит Test 1
для вызова. Есть ли причина, почему это происходит? Как это обойти? Я был бы признателен за объяснение, почему это происходит. Спасибо!
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) {
}
});
}