Android Firebase ChildEventListener вызывается дважды - PullRequest
0 голосов
/ 29 мая 2018

В моем приложении чата я хочу получать каждое новое сообщение, которое кто-либо отправляет (ПОСЛЕДНЕЕ СООБЩЕНИЕ).

Однако, когда я присоединяю ChildEventListener в своем приложении, onChildAdded() вызывается дважды.

Вот код:

 chatRoomLastMessageUpdateReference = FirebaseDatabase.getInstance().getReference().
                        child(Constants.FIRE_BASE_PATH_CHAT_ROOMS).child(roomKey);
 chatRoomLastMessageChildListener = mChatHelper
        .getLastMessage(mAdapterChat, chatRoomLastMessageUpdateReference, mRecyclerChat);
 chatRoomLastMessageUpdateReference
        .addChildEventListener(chatRoomLastMessageChildListener);

Вот метод getLastMessage():

 public ChildEventListener getLastMessage(final AdapterChat mAdapterChat, final DatabaseReference pollRoomLastMessageUpdateReference, final RecyclerView mRecyclerChat) {

        Query queryLastMessage = pollRoomLastMessageUpdateReference.orderByKey().limitToLast(1);

        ChildEventListener childEventListener = queryLastMessage.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                Message message = dataSnapshot.getValue(Message.class);
                Log.d("message", "onChildAdded: " + message.getMessage());
                mAdapterChat.updateLastMessage(message);
                mRecyclerChat.getLayoutManager().scrollToPosition(mAdapterChat.getMessagesObekt().size() - 1);
            }

            @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(DatabaseError databaseError) {

            }
        });

        return childEventListener;
    }

, а вот ChildEventListener detach:

 @Override
    protected void onDestroy() {
        super.onDestroy();
        if (chatRoomLastMessageChildListener != null) {
            chatRoomLastMessageUpdateReference.removeEventListener(chatRoomLastMessageChildListener);
        }
    }

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

05-29 09:55:38.000 30212-30212/com.example.petar.votemeup D/message: onChildAdded: called message1
05-29 09:55:38.001 30212-30212/com.example.petar.votemeup D/message: onChildAdded: called message1
05-29 09:55:40.382 30212-30212/com.example.petar.votemeup D/message: onChildAdded: called message2
05-29 09:55:40.384 30212-30212/com.example.petar.votemeup D/message: onChildAdded: called message2
05-29 09:55:42.954 30212-30212/com.example.petar.votemeup D/message: onChildAdded: called message3
05-29 09:55:42.955 30212-30212/com.example.petar.votemeup D/message: onChildAdded: called message3

ОБНОВЛЕНИЕ ОБНОВЛЕНИЕ

Забавный факт, когда я не присоединяю ChildEventListener, тогда все в порядке.Но сейчас я не понимаю, как мне отключить ChildEventListener, если я его не присоединяю.Итак, когда я так делаю, все нормально

   chatRoomLastMessageUpdateReference = FirebaseDatabase.getInstance().getReference().
                        child(Constants.FIRE_BASE_PATH_CHAT_ROOMS).child(roomKey);
                chatRoomLastMessageChildListener = mChatHelper.getLastMessage(mAdapterChat, chatRoomLastMessageUpdateReference, mRecyclerChat);
                //i remove this line of code below, its working but, i feel that this is not the correct
                //chatRoomLastMessageUpdateReference.addChildEventListener(chatRoomLastMessageChildListener);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...