¿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.
- Borrar la persistencia de firebase después de cerrar la sesión
- error de entrada duplicado después de agregar servicios google
- NoClassDefFoundError: com.google.firebase.FirebaseOptions
- ¿Cómo usar la marca de hora del servidor Firebase para generar la fecha creada?
- Esperaba un mapa mientras se deserializaba, pero obtuvo una clase java.lang.Long
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) { } }); }
- Firebase recupera datos de un niño por clave
- Firebase se bloquea en ninguna conexión a Internet
- Cómo recuperar un objeto List de la base de firebase en android
- obtener imagen con picasso basado en userId firebase
- Rare NullPointerException en GoogleApiClient usando Firebase
- Cómo rellenar Android ListView con información de la consulta de Firebase
- ¿Cómo definir una audiencia con Firebase Analytics?
- Firebase "mientras se deserializaba, pero obtuvo una clase java.util.ArrayList"
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'
- Error al iniciar el emulador x86 de Android en Travis CI
- Daga de referencia no resuelta 2 + kotlin + androide gradle