¿Sabe cuándo Firebase ha completado la llamada API?

Tengo problemas para saber cuando se finaliza mi llamada a la API de Firebase. Después de leer la Firebase documentation he encontrado lo siguiente:

Los eventos de valor siempre se activan por último y se garantiza que contienen actualizaciones de cualquier otro evento que ocurrió antes de que se tomara la instantánea.

Entiendo que esto significa que sólo después de que onChildAdded llamada ValueEventListener se llama al ValueEventListener . Como resultado, pensé que podía llenar mi RecyclerView en la función onChildAdded y luego la llamada onSingleValueListener , simplemente puedo terminar de animar mi pantalla de carga (que ha comenzado a animar antes de esta llamada de función) y continuar. Sin embargo, me he topado con un problema en el que he puesto algunas declaraciones System.out.println cuidado y encontró que en mi caso, la Test 1 se llama antes de que la Test 2 se llama. Esto causa problemas porque este es realmente el comportamiento opuesto de lo que quería: quería que la función onChildAdded para terminar y luego llamar a la función onSingleValueListener que imprime la Test 1 para ser llamado. ¿Hay alguna razón para que esto suceda? ¿Alguna manera de evitar esto? Agradecería una explicación de por qué esto está sucediendo. ¡Gracias!

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

Con este código "Firebase linkRef = firebaseRef.child("/posts/" + postId);" Puedo ver que está utilizando el API de Firebase legado. Su desaprobado ahora!

Por favor, actualice su código a la nueva API Firebase 3.xx.

Debajo de dos son la llamada asíncrona independiente; Basado en su caso de uso, puede utilizar uno de los oyentes para leer sus datos.

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

Puede consultar el documento de firebase para obtener más información sobre los oyentes de la base de datos. https://firebase.google.com/docs/database/android/retrieve-data

Con el fragmento de código siguiente, puede recuperar y rellenar su lista de comentarios.

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

¡Espero que esto te ayude!

Es posible que desee utilizar la clase **FirebaseRecyclerAdapter** que el equipo Firebase pone a disposición en FirebaseUI-Android (consulte https://github.com/firebase/FirebaseUI-Android/blob/master/database/src/main/java/ Com / firebase / ui / base de datos / FirebaseRecyclerAdapter.java )

En su archivo gradle, agregue la línea a continuación (compruebe aquí para ver el último número de versión en el readme) compile 'com.firebaseui: firebase-ui-database: 0.4.3'

  • ¿Cuál es el límite de caracteres para el texto del mensaje en la notificación basada en la consola de Firebase?
  • ¿Cómo recuperar mensajes que están dentro de 0.5 kms de mi alcance?
  • Actualizar la interfaz de usuario de Android desde la devolución de llamada de firebase
  • Ningún setter / campo para la advertencia Base de datos Firebase Recuperar datos Llenar Listview
  • ¿Las notificaciones no siempre se reciben por teléfono?
  • Una aplicación Android de Firebase con autenticación de cliente / aplicación en lugar de autenticación de usuario
  • La función Cloud de Firebase activa dos veces onUpdate
  • ¿Se pueden eliminar las propiedades de usuario de Firebase Analytics?
  • Enlaces dinámicos de Firebase manejados dos veces
  • Firebase setDisplayName del usuario al crear el usuario Android
  • Recuperación de datos de firebase
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.