0

我正在使用 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);
        }
    }
};

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

4

2 回答 2

1

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

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

于 2013-11-16T08:59:34.497 回答
1

您需要获取要获取历史记录的特定用户的聊天对话框。实际上,当两个用户第一次开始聊天时,会创建一个对话框供他们进行聊天。他们将始终在此对话框下聊天。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) {
            }
        });

    }
于 2015-08-16T07:57:40.250 回答