¿Cómo hacer un seguimiento de los oyentes en Firebase en Android?
Tengo una lista de salas de chat para un usuario determinado en una ubicación y el número total de mensajes para una sala de chat dada en otra ubicación. Quiero hacer un seguimiento de una serie de mensajes en las salas de chat usuario pertenece a.
Tengo un siguiente fragmento:
- Mostrar estructura de datos no lineal como árbol en Android View
- ¿Es posible cambiar la fuente de entrada de TV de forma programática?
- Cómo enviar mensajes desde la aplicación de Android a través del mensaje de Viber
- No se pudo bloquear la superficie
- Bluetooth: falla en el descubrimiento del servicio
//getting all chat rooms this user belongs to mFirebase.child("myChatRooms").child("testUser").addChildEventListener(new ChildEventListener() { @Override public void onChildAdded (DataSnapshot dataSnapshot, String previousKey){ for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { ChatRoom myRoom = postSnapshot.getValue(ChatRoom.class); //listening to message count in every chat room user belongs to mFirebase.child("chatRoomMessageCount").child(postSnapshot.getKey()).addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { //number of messages have changed } @Override public void onCancelled(FirebaseError firebaseError) { } }); } } //...... }
La pregunta es, ¿cómo puedo eliminar todos los ValueEventListener más tarde, cuando onChildRemoved se llamará, o no los necesito más?
¿Cuál es el enfoque recomendado para hacer frente a esta situación? ¿Debo almacenar la clave de niño y el oyente en HashMap y mantener un registro de ellos yo mismo o hay alguna manera de eliminar a todos los oyentes de una ubicación de firebase dada?
- Introducción al desarrollo de Android
- Android y Javadoc: @inheritDoc no funciona
- Descargar html source android?
- Cómo importar la clase android.support.v7.app.NotificationCompat.Builder en Android Studio
- ¿Cómo utilizar las variables estáticas de manera eficiente?
- ¿Cómo continuar un bucle for después de un tiempo determinado sin usar el método `try ... catch`?
- Android 5.x ClassNotFoundException funciona bien en 6.0+
- OnFling y multitouch - múltiples punteros MotionEvent
Una forma concienzuda de datos sería crear un HashMap
de ValueEventListeners
y luego en onStop
o onDestroy
quitarías esos oyentes.
Para mantener las cosas simples, usted debe utilizar un único oyente de eventos para obtener las habitaciones. A continuación, para cada habitación se puede crear un oyente en tiempo real.
public class MainActivity extends Activity { private Firebase mRef; private HashMap<Firebase, ValueEventListener> mListenerMap; @Override protected void onStart() { super.onStart(); mRef = new Firebase("https://<your-firebase-app>/myChatRooms/testUser"); mRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { ValueEventListener listener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // do your thing here } @Override public void onCancelled(FirebaseError firebaseError) { } }; mListenerMap.put(postSnapshot.getRef(), listener); Firebase childRef = mRef.child("chatRoomMessageCount").child(postSnapshot.getKey()); childRef.addValueEventListener(listener); } } @Override public void onCancelled(FirebaseError firebaseError) { } }); } @Override protected void onStop() { super.onStop(); for (Map.Entry<Firebase, ValueEventListener> entry : mListenerMap.entrySet()) { Firebase ref = entry.getKey(); ValueEventListener listener = entry.getValue(); ref.removeEventListener(listener); } } }