В моем приложении чата я хочу получать каждое новое сообщение, которое кто-либо отправляет (ПОСЛЕДНЕЕ СООБЩЕНИЕ).
Однако, когда я присоединяю 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);