2016-07-20 28 views
11

benim Firebase API görüşme bittiğinde bilerek bazı sorun yaşıyorum. Firebase documentation okuduktan sonra aşağıdaki bulduk:bilmek?

Değer olaylar hep son tetiklenir ve bu anlık çekildiği önce gerçekleşen başka olaylar güncellemelerini içerecek şekilde garanti edilir.

Bunların hepsinin onChildAdded Çağrı bittikten sonra, daha sonra ValueEventListener denir demek anlıyoruz. Sonuç olarak, RecyclerView'umu onChildAdded işlevine ve ardından onSingleValueListener aramasına yerleştirebileceğimi düşündüm, yükleme ekranımı (bu işlev çağrısından önce animasyonu başlatan) canlandırmayı bitirebilir ve devam edebilirim. Ancak, bazı dikkatli System.out.println ifadeleri koymak ve Test 2 hiç çağrılmadan önce benim durumumda, Test 1 denir bulundu sorunu haline çalıştırmak. Bu aslında istediğim ters bir davranıştır çünkü bu sorunlara neden olur: bitirmek ve sonra çağrılacak Test 1 yazdırır onSingleValueListener işlevi çağırmak için onChildAdded fonksiyonunu istedi. Bunun gerçekleşmesinin bir sebebi var mı? Bunun herhangi bir yolu var mı? Bunun neden olduğuyla ilgili bir açıklama için minnettar olurum. Teşekkürler!

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);" Eski Firebase API'sini kullandığınızı düşünüyorum; Ben haklı mıyım –

+0

Bu belgeye bakın ve yeni Firebase Veritabanı API'sinde deneyin; "Https://firebase.google.com/docs/database/android/start/"; –

cevap

4

Bu kodla "Firebase linkRef = firebaseRef.child("/posts/" + postId);" Eski Firebase API'sini kullandığınızı görebiliyorum. Artık onaylanmadı!

Lütfen yeni Firebase 3.x.x API için kodunuzu güncelleyin. İki Aşağıda

bağımsız zaman uyumsuz çağrı vardır; Kullanım durumunuza göre, verilerinizi okumak için dinleyicilerin birini kullanabilirsiniz.

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

Veritabanı dinleyicileri hakkında daha fazla bilgi almak için firebase belgesine başvurabilirsiniz.

Aşağıdaki kod parçacığıyla, yorum listenizi alabilir ve doldurabilirsiniz.

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

Bu yardımcı olur umarım!