我正在使用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个用户在群组中发送消息时,则user2可以&#39 ;但是当用户2在该组内发送消息时,他们都能够接收消息。
请帮助我,我无法找到解决方案。请不要提供已经弃用的建议。
先谢谢。!!
答案 0 :(得分: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);
必须添加一个侦听器ONCE,否则您将创建大量的线程。可能它有效,因为你有一个单身人士。虽然你有一个听众,但如果你不删除它,你就不需要再添加它了。
mConnection.addSyncStanzaListener(this, null);
小心:你正在添加你的监听器(哪一个?你用相同的类实现了大量的监听器)到你的连接。在你的代码之前或之后会吃一个重要的节(增加一个自定义IQ),你会发现很难发现副作用。 mConnection.addAsyncStanzaListener(this, null);
同样的3 ProviderManager.addExtensionProvider()
你需要一些。希望有所帮助。
答案 1 :(得分: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);
}
}