Как отслеживать слушателей в Firebase на Android?

У меня есть список чатов для данного пользователя в одном месте и общее количество сообщений для данного чата в другом месте. Я хочу отслеживать количество сообщений в чате, к которым принадлежит пользователь.

У меня есть следующий фрагмент:

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

Вопрос в том, как я могу удалить все эти значения ValueEventListener позже, когда будет вызван onChildRemoved, или они мне больше не понадобятся?

Каков рекомендуемый подход при решении этой ситуации? Должен ли я хранить дочерний ключ и прослушиватель в HashMap и отслеживать их самостоятельно, или есть способ удалить всех слушателей для данного места в firebase?

ValueEventListeners способом было бы создать HashMap из ValueEventListeners а затем в onStop или onDestroy вы удалите этих слушателей.

Чтобы все было просто, вы должны использовать одного прослушивателя событий, чтобы получить номера. Затем для каждой комнаты вы можете создать слушателя в реальном времени.

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