使用 asmack 在群聊中发送后收到多条消息

Posted

技术标签:

【中文标题】使用 asmack 在群聊中发送后收到多条消息【英文标题】:Receiving multiple messages after sending in group chat using asmack 【发布时间】:2016-05-11 13:43:03 【问题描述】:

在发送消息后,它正在接收到该组。但与此同时,我又收到了所有以前的消息。帮我解决这个问题。 这是我的代码:

send.setOnClickListener(new View.OnClickListener()             
    public void onClick(View view) 
        to = groupname + "@conference.localhost".toString();
        String text = (textMessage.getText().toString());
        textMessage.setText("");

        muc = new MultiUserChat(connection, to);

        try 
            muc.join(USERNAME);
         catch (XMPPException e) 
            e.printStackTrace();
        

        Message msg = new Message(to, Message.Type.groupchat);
        msg.setBody(text);
        if (connection != null) 
            connection.sendPacket(msg);
            Msg data = new Msg();
            data.setMessage(text);
            data.setName(userFrom);
            data.setDate(DateAndTime.getCurrentDate());
            data.setTime(DateAndTime.getCurrentTime());
            data.setSender(true);
            MessageListAdapter.messagesItems.add(data);
            notifyMyAdapter();
        
    
);

这是我的接收代码:

public void setConnection(XMPPConnection connection) 

    this.connection = connection;
    if(connection != null) 

        PacketFilter filter = new MessageTypeFilter(Message.Type.groupchat);
        connection.addPacketListener(new PacketListener() 
            @Override
            public void processPacket(Packet packet) 

                Message message = (Message) packet;
                if (message.getBody() != null) 
                    String fromName = StringUtils.parseBareAddress(message.getFrom());
                 Log.i("XMPPChatDemoActivity ", " Text Recieved " + message.getBody() + " from " + fromName);
                    Msg data = new Msg();
                    String subject = message.getSubject();

                    if (subject == null) 
                        data.setMessage(message.getBody());
                        data.setName(NAME);
                        data.setDate(DateAndTime.getCurrentDate());
                        data.setTime(DateAndTime.getCurrentTime());
                        data.setSender(false);
                        MessageListAdapter.messagesItems.add(data);

                    mHandler.post(new Runnable() 
                        @Override
                        public void run() 
                            notifyMyAdapter();
                        
                    );
                 else if (subject.equals(""))
                    data.setMessage(message.getBody());
                    data.setName(NAME);
                    data.setDate(DateAndTime.getCurrentDate());
                    data.setTime(DateAndTime.getCurrentTime());
                    data.setSender(false);
                    MessageListAdapter.messagesItems.add(data);
                    // Add the incoming message to the list view
                    mHandler.post(new Runnable() 
                        public void run() 
                            notifyMyAdapter();
                        
                    );
                
            
        

        ,filter);
    


【问题讨论】:

【参考方案1】:

MultiUserChat 中,要控制加入房间时接收的历史记录数量,您需要提供一个已配置的DiscussionHistory 对象。有关MultiUserChatrefer this的更多信息

muc.join(String nickname, String password, DiscussionHistory history, long timeout)

其中DiscussionHistory 类控制字符数 或进入房间时收到的消息。房间将决定 如果您不指定要返回的历史记录数量 DiscussionHistory 加入房间时。更多信息refer this

例子:

MultiUserChat muc = new MultiUserChat(connection, to);
DiscussionHistory history = new DiscussionHistory(); history.setMaxStanzas(0);
muc.join("username", "password", history, SmackConfiguration.getPacketReplyTimeout());

【讨论】:

以上是关于使用 asmack 在群聊中发送后收到多条消息的主要内容,如果未能解决你的问题,请参考以下文章

如何使用电报机器人 api 在群聊中接收消息

在群聊中,新消息事件(websocket)应该由客户端发送还是API发送?

如何使用 Skype4COM 在 Skype 群聊中发送消息?

如何在 IOS 的 XMPP 群聊中接收通知

在 xmpp 群聊中发送聊天标记

使用 smack 的多用户聊天没有收到消息侦听器