2

我正在使用 smack 库开发聊天应用程序。我在群聊中遇到问题。在我的应用程序中,我正在创建一个组,并且成员是自动加入的。我想在我在组中发送消息时通知所有用户,即使他们没有发起聊天。我的代码如下,我有将侦听器放在 init 方法中但无法接收消息。

        multiUserChatManager = MultiUserChatManager.getInstanceFor(mConnection);
        mMultiUserChat = multiUserChatManager.getMultiUserChat(to);
        mConnection.addAsyncStanzaListener(this, null);
        DiscussionHistory history = new DiscussionHistory();
        history.setMaxStanzas(0);
        mMultiUserChat.addMessageListener(this);
        mConnection.addSyncStanzaListener(this, null);
        try {
            mMultiUserChat.join(from, "", history, SmackConfiguration.getDefaultPacketReplyTimeout());
        } catch (SmackException.NoResponseException e) {
            e.printStackTrace();
        } catch (XMPPException.XMPPErrorException e) {
            e.printStackTrace();
        } catch (SmackException.NotConnectedException e) {
            e.printStackTrace();
        }

这是组的消息侦听器

 @Override
public void processMessage(Message message) { 
    Logg.e(TAG,"Message received group.."); 
}

我不知道为什么当有人在群组中发送消息时此方法不会调用,即使我加入了群组,如果我创建 1 个群组并加入 2 个用户,当 1 个用户在群组中发送消息时,用户 2 无法接收消息,但是当用户 2 在该组内发送消息时,他们都能够接收消息。

请帮助我,我无法找到解决方案。请不要提供已弃用的建议。

提前致谢。!!

4

2 回答 2

1

在完整的代码审查之后,我正在完整地编辑答案。-再次-

我建议重构你的代码,以保持超过 1 个大类中的角色分离。

基本上,由于您的代码中有许多“addasync - addsync”,您在错误的侦听器中检查消息,并且您能够接收消息,就像您的怪物类全能的副作用一样!

我看到您需要对代码应用许多优化。解释起来太长了,而且不可能,但是,就像示例一样:

1. sendGroupMessage You can check by MultiUserChatManager if you
already joined the chat and then send the message. You must fire a
"join" just once, not everytime you want to send a message.

2. mMultiUserChat.addMessageListener(this); 必须添加一次侦听器,否则您将创建大量线程。可能它有效,因为你有一个单身人士。当您有一个听众时,如果您不删除它,您就不需要再将它添加到该聊天中。

  1. mConnection.addSyncStanzaListener(this, null); 请注意:您正在将您的监听器(哪个?您实现了大量具有相同类的监听器)添加到您的连接中。之前或之后,您的代码将吃掉一个重要的节(prolly 一个自定义 IQ),您将很难发现副作用。
  2. mConnection.addAsyncStanzaListener(this, null);相同的 3
  3. 检查ProviderManager.addExtensionProvider(),之前或之后你会需要一些。

希望有帮助。

于 2016-11-21T14:24:48.487 回答
1

尝试这个

step1 : 1 删除这个

mConnection.addAsyncStanzaListener(this, null);
mConnection.addSyncStanzaListener(this, null);

第2步:添加这个

 private StanzaTypeFilter serverFilter;
    private StanzaListener stanzaListener = null;
    private XMPPTCPConnection mConnection;



 registerStanzaListener(); // where you init connection

public void registerStanzaListener() {
        serverFilter = new StanzaTypeFilter(Message.class);

        if (stanzaListener != null) {
            mConnection.removeAsyncStanzaListener(stanzaListener);
        }

        stanzaListener = new StanzaListener() {
            @Override
            public void processPacket(Stanza packet) throws SmackException.NotConnectedException {
                processMessage((Message) packet);
            }
        };

        mConnection.addAsyncStanzaListener(stanzaListener, serverFilter);
    }

    }
于 2016-11-22T10:50:28.030 回答