Подтвердить что ты не робот

Как отслеживать слушателей в 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?

4b9b3361

Ответ 1

Разумным способом было бы создать 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);
        }
    }
}