无法使用 smack-android:4.1.4 接收群聊消息
Can't able to receive group chat messages using smack-android:4.1.4
我正在使用 smack 库开发聊天应用程序。我在群聊中遇到问题。在我的应用程序中,我正在创建一个组,其中的成员是自动的-joined.i 想要在我在组中发送消息时通知所有用户,即使他们没有启动 chat.My 代码如下因为我在 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不能能够接收消息,但是当用户2在该组内发送消息时,他们都能够接收消息。
请帮帮我,我找不到解决办法。请不要给出已经弃用的建议。
提前致谢!
完整的代码审查后,我正在编辑完整的答案。 -再次-
我建议重构您的代码,以在超过 1 个巨大 class 中保持角色分离。
基本上,由于您的代码中有许多 "addasync - addsync",您在错误的侦听器中接收消息,并且您能够接收消息,就像您的怪物-class-all-in 的副作用一样!
我看到您需要对代码应用许多优化。
太长了,没法解释,不过举个例子:
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);
必须添加一次侦听器,否则您将创建大量线程。可能它有效,因为你有一个单身人士。当你有一个监听器时,如果你不删除它,你就不需要再将它添加到该聊天中。
mConnection.addSyncStanzaListener(this, null);
小心:您正在将您的侦听器(哪一个?您实现了大量具有相同 class 的侦听器)到您的连接中。之前或之后你的代码将吃掉一个重要的节(很可能是一个自定义 IQ)并且你将很难发现副作用。
mConnection.addAsyncStanzaListener(this, null);
同 3
- 在
ProviderManager.addExtensionProvider()
之前或之后检查
你需要一些。
希望对您有所帮助。
试试这个
步骤 1 : 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);
}
}
我正在使用 smack 库开发聊天应用程序。我在群聊中遇到问题。在我的应用程序中,我正在创建一个组,其中的成员是自动的-joined.i 想要在我在组中发送消息时通知所有用户,即使他们没有启动 chat.My 代码如下因为我在 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不能能够接收消息,但是当用户2在该组内发送消息时,他们都能够接收消息。
请帮帮我,我找不到解决办法。请不要给出已经弃用的建议。
提前致谢!
完整的代码审查后,我正在编辑完整的答案。 -再次-
我建议重构您的代码,以在超过 1 个巨大 class 中保持角色分离。
基本上,由于您的代码中有许多 "addasync - addsync",您在错误的侦听器中接收消息,并且您能够接收消息,就像您的怪物-class-all-in 的副作用一样!
我看到您需要对代码应用许多优化。 太长了,没法解释,不过举个例子:
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);
必须添加一次侦听器,否则您将创建大量线程。可能它有效,因为你有一个单身人士。当你有一个监听器时,如果你不删除它,你就不需要再将它添加到该聊天中。
mConnection.addSyncStanzaListener(this, null);
小心:您正在将您的侦听器(哪一个?您实现了大量具有相同 class 的侦听器)到您的连接中。之前或之后你的代码将吃掉一个重要的节(很可能是一个自定义 IQ)并且你将很难发现副作用。mConnection.addAsyncStanzaListener(this, null);
同 3- 在
ProviderManager.addExtensionProvider()
之前或之后检查 你需要一些。
希望对您有所帮助。
试试这个
步骤 1 : 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);
}
}