[英]Android Firebase ChildEventListener called twice
在我的聊天应用程序中,我想获取某人发送的每条新消息(最后一条消息)。
但是,当我在我的应用程序中附加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
分离:
@Override
protected void onDestroy() {
super.onDestroy();
if (chatRoomLastMessageChildListener != null) {
chatRoomLastMessageUpdateReference.removeEventListener(chatRoomLastMessageChildListener);
}
}
这是用户发送新聊天消息后调用的登录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);
在这里查看我的答案。 https://stackoverflow.com/a/73677221/7042992在我的案例中,第二个触发器是由于数据中的 ServerValue.TIMESTAMP。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.