【问题标题】:Quickblox: Only receive the correct messagesQuickblox:只接收正确的消息
【发布时间】:2013-11-11 19:53:38
【问题描述】:

我正在使用 quickblox 进行聊天,但在打开新聊天时遇到了一些问题。突然间,我收到了其他用户在我断开连接时发送给我的所有消息。问题是,当我开始与用户 A 聊天时,我会在用户 A 聊天室中收到来自用户 B、C、D.. 的聊天。

我找到了只显示 A 用户的方法。但问题是服务器已经向我发送了“断开连接”的消息,所以当我开始与 BI 聊天时,没有收到任何文本,因为用户 B 发送给我的消息已经传递(并省略),而我正在和用户 A 聊天。

如何接收待处理的消息(一种历史记录)或仅检索我登录的聊天消息?

我的一段代码:

private MessageListener messageListener = new MessageListener() {

    @Override
    public void processMessage(Chat chat, Message message) {

        System.out.println("CridaC");

         String from = message.getFrom().split("@")[0];
            String to = message.getTo().split("@")[0];

            System.out.println(String.format(">>> Message received (from=%s, to=%s): %s",from, to, message.getBody()));

//              return;

        if (onMessageReceivedListener != null && message.getBody() != null) {
            System.out.println("CridaD");

            onMessageReceivedListener.onMessageReceived(message);
        }
    }
};

有人知道我通过几个步骤部署聊天的方法吗?

【问题讨论】:

    标签: android xmpp chat quickblox


    【解决方案1】:

    这是正常行为。登录后,您将收到所有用户的所有消息。如果您现在正在与用户 A 聊天,则无关紧要。

    可能的解决方案 - 将所有新消息存储到 ArrayList、HashMap 中。 当您打开与用户 B 的聊天时 - 只需从此 ArrayList/HashMap 中检索来自用户 B 的消息并将它们显示在您的屏幕上。

    【讨论】:

    • 我已经实现了一个内部数据库来解决这种情况。现在需要这种行为。谢谢
    【解决方案2】:

    您需要获取您想要获取历史记录的特定用户的聊天对话框。 实际上,当两个用户第一次开始聊天时,会创建一个对话框供他们进行聊天。他们将始终在此对话框下聊天。 Dialog可以说是一种聊天平台。对话框也有一个对话框 id。 Quickblox 提供了一个函数来代表您要聊天的朋友 ID 创建对话(您需要将朋友 ID 传递到此函数中)。如果这是第一次聊天,此函数会为您创建一个 dialogId,如果您之前进行过聊天,则返回现有的对话 ID。得到这个dialogID后,就可以借助这个dialogID获取聊天记录了。

    结论:只能通过dialogID获取聊天记录。

    代码如下:

    1.) 创建一个 chatManager 对象。

    2.) 使用 QuickBlox QBChatMessage 对象创建您的自定义消息对象:

    public class ChatMessageModel {
        private Integer id;
        private String body;
        private Collection<Integer> readIds;
        private Integer recipientId;
        private String nameToDisplayOnlyWhenAMessageIsReceived;
        private String messageId;
        private Integer senderId;
        private String message;
        private String dialogId;
        private long time;
        private boolean isMessageSelected=false; //true if user selects an item or copy or delete and vice versa
    
        public boolean isMessageSelected() {
            return isMessageSelected;
        }
    
        public void setIsMessageSelected(boolean isMessageSelected) {
            this.isMessageSelected = isMessageSelected;
        }
    
        public String getMessageId() {
            return messageId;
        }
        public void setMessageId(String messageId) {
            this.messageId = messageId;
        }
    
        public Integer getSenderId() {
            return senderId;
        }
    
        public void setSenderId(Integer senderId) {
            this.senderId = senderId;
        }
    
    
        public void setId(Integer id) {
            this.id = id;
        }
        public Integer getId() {
            return id;
        }
    
        public String getBody() {
            return body;
        }
    
        public String getNameToDisplayOnlyWhenAMessageIsReceived() {
            return nameToDisplayOnlyWhenAMessageIsReceived;
        }
    
        public void setNameToDisplayOnlyWhenAMessageIsReceived(String nameToDisplayOnlyWhenAMessageIsReceived) {
            this.nameToDisplayOnlyWhenAMessageIsReceived = nameToDisplayOnlyWhenAMessageIsReceived;
        }
    
    
        public void setBody(String body) {
            this.body = body;
        }
    
    //    public Collection<Integer> getReadIds() {
    //        return readIds;
    //    }
    
        public void setReadIds(Collection<Integer> readIds) {
            this.readIds = readIds;
        }
    
        public Integer getRecipientId() {
            return recipientId;
        }
    
        public void setRecipientId(Integer recipientId) {
            this.recipientId = recipientId;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public String getMessage() {
            return message;
        }
    
        public String getDialogId() {
            return dialogId;
        }
    
        public void setDialogId(String dialogId) {
            this.dialogId = dialogId;
        }
    
        public void setTime(long time) {
            this.time = time;
        }
    
        public Long getTime() {
            return time;
        }
    
        @Override
        public boolean equals(Object obj) {
        //    return super.equals(o);
            if (obj == null || obj.getClass() != ChatMessageModel.class) {
                return false;
            }
            ChatMessageModel other = (ChatMessageModel) obj;
            if (other.messageId != this.messageId) {
                return false;
            }
    
            return true;
        }
    
        @Override
        public int hashCode() {
        //    return super.hashCode();
            return messageId == null ? 0 : messageId.hashCode();
        }
    
        @Override
        public String toString() {
            return messageId;
        }
    }
    

    3.) 获取聊天记录功能:

    public void getChatHistoryForDialog(Integer otherUserId, final Integer numberOfMessages) {
    
            final ArrayList<ChatMessageModel> myList = new ArrayList<ChatMessageModel>();
    
            privateChatManager.createDialog(otherUserId, new QBEntityCallbackImpl<QBDialog>() {
                @Override
                public void onSuccess(final QBDialog dialog, Bundle args) {
                    QBRequestGetBuilder requestBuilder = new QBRequestGetBuilder();
                    requestBuilder.sortAsc("last_message_date_sent");
                    requestBuilder.setPagesLimit(numberOfMessages.intValue());// limit of max messages fetch from server
                    QBChatService.getDialogMessages(dialog, requestBuilder, new QBEntityCallbackImpl<ArrayList<QBChatMessage>>() {
                        @Override
                        public void onSuccess(ArrayList<QBChatMessage> messages, Bundle args) {
                            for (QBChatMessage message : messages) {
                                ChatMessageModel model = new ChatMessageModel();
                                model.setIsMessageSelected(false);
                                model.setId(message.getSenderId());
                                model.setMessageId(message.getId());
                                model.setMessage(message.getBody());
                                message.setMarkable(true);
                                model.setTime(message.getDateSent() * 1000L);// Multiplied by 1000L because the time given by Quickblox server is epoch time
                                model.setReadIds(message.getReadIds());
                                model.setRecipientId(message.getRecipientId());
                                model.setDialogId(dialog.getDialogId());
                                myList.add(model);
                            }
    
                        }
    
                        @Override
                        public void onError(List<String> errors) {
                        }
                    });
                }
    
                @Override
                public void onError(List<String> errors) {
                }
            });
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 2022-01-23
      • 2022-01-02
      • 2020-12-06
      • 1970-01-01
      • 2014-01-12
      相关资源
      最近更新 更多