2016-07-20 28 views
11

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) { 

     } 
    }); 
} 
+0

"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? –

+0

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/"; –

Trả lời

4

Với mã này "Firebase linkRef = firebaseRef.child("/posts/" + postId);" Tôi có thể thấy rằng bạn đang sử dụng API Firebase cũ. Không được dùng nữa!

Vui lòng cập nhật mã của bạn lên API Firebase 3.x.x mới.

Dưới hai là cuộc gọi không đồng bộ độc lập; Dựa trên trường hợp sử dụng của bạn, bạn có thể sử dụng một trong những người nghe để đọc dữ liệu của bạn.

1. linkRef.addListenerForSingleValueEvent(new ValueEventListener() {}); 
2. linkRef.addChildEventListener(new ChildEventListener() {}); 

Bạn có thể tham khảo tài liệu firebase để biết thêm thông tin về trình lắng nghe cơ sở dữ liệu. https://firebase.google.com/docs/database/android/retrieve-data

Với đoạn mã sau, bạn có thể truy xuất và điền danh sách nhận xét của mình.

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 
     } 
    }); 

Hy vọng điều này sẽ giúp bạn!

4

Bạn có thể muốn sử dụng lớp **FirebaseRecyclerAdapter** mà nhóm căn cứ hỏa lực làm cho có sẵn trong FirebaseUI-Android (xem https://github.com/firebase/FirebaseUI-Android/blob/master/database/src/main/java/com/firebase/ui/database/FirebaseRecyclerAdapter.java)

Trong file gradle bạn thêm dòng dưới đây (đánh dấu here cho số phiên bản mới nhất trong readme) biên dịch 'com.firebaseui: cơ sở dữ liệu firebase-ui: 0.4.3'

Các vấn đề liên quan