Tôi gặp sự cố khi biết khi cuộc gọi API Firebase của tôi kết thúc. Sau khi đọc số Firebase documentation
Tôi đã tìm thấy các thông tin sau:Biết khi nào Firebase đã hoàn tất cuộc gọi API?
Sự kiện giá trị luôn được kích hoạt sau cùng và được đảm bảo chứa thông tin cập nhật từ bất kỳ sự kiện nào khác đã xảy ra trước khi chụp nhanh.
Tôi hiểu điều này có nghĩa là chỉ sau khi tất cả các cuộc gọi onChildAdded
hoàn tất, sau đó gọi số ValueEventListener
. Kết quả là, tôi nghĩ rằng tôi có thể điền RecyclerView
vào chức năng onChildAdded
và sau đó gọi onSingleValueListener
, tôi có thể hoàn thành hoạt ảnh màn hình tải (đã bắt đầu hoạt ảnh trước khi gọi hàm này) và tiếp tục. Tuy nhiên, tôi đã gặp phải sự cố khi tôi đặt một số tuyên bố cẩn thận System.out.println
và thấy rằng trong trường hợp của tôi, Test 1
được gọi trước khi Test 2
được bao giờ gọi. Điều này gây ra vấn đề bởi vì đây thực sự là hành vi ngược lại của những gì tôi muốn: Tôi muốn chức năng onChildAdded
kết thúc và sau đó gọi hàm onSingleValueListener
để in ra Test 1
để được gọi. Có lý do nào tại sao điều này xảy ra không? Bất kỳ cách nào xung quanh điều này? Tôi sẽ đánh giá cao một giải thích về lý do tại sao điều này đang xảy ra. Cảm ơn!
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) {
}
});
}
"Liên kết FirebaseRef = firebaseRef.child ("/posts/"+ postId);" Tôi nghĩ bạn đang sử dụng API Firebase cũ; Tôi có đúng không? –
Tham khảo tài liệu này và dùng thử trong API cơ sở dữ liệu Firebase mới; "https://firebase.google.com/docs/database/android/start/"; –