繁体   English   中英

Android Firebase ChildEventListener 调用了两次

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM