android - 无法使用 smack-android :4. 1.4 接收群聊消息

标签 android xmpp smack groupchat

我正在使用 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 无法调用接收消息,但是当用户 2 在该组内发送消息时,他们都能够接收消息。

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

提前致谢。!!

最佳答案

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

我建议重构您的代码,以在多个大型类中保持角色分离。

基本上,由于代码中存在许多“addasync - addsync”,您正在错误的监听器中查看消息,并且您能够接收消息,就像您的 Monster-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); 请小心:您正在将监听器(哪一个?您实现了大量具有相同类的监听器)添加到您的连接中。在此之前或之后,您的代码将吃掉一个重要的节(可能是自定义 IQ),并且您将遇到难以发现的副作用。
  • mConnection.addAsyncStanzaListener(this, null); 与 3 相同
  • 之前或之后检查 ProviderManager.addExtensionProvider() 你需要一些。
  • 希望有帮助。

    关于android - 无法使用 smack-android :4. 1.4 接收群聊消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40719732/

    相关文章:

    android - 以编程方式将 boxBackgroundMode 设置为 TextInputLayout

    android - 由 : org. gradle.api.internal.plugins.PluginApplicationException 引起:无法应用插件 [id 'com.android.application']

    python - pyxmpp2 连接到 openfire 无法解析 NXDOMAIN

    android - 未调用 Smack 消息监听器且连接不稳定

    java - Smack API 抛出 item-not-found(404) 异常

    java - 如何确保 ORMLite 数据库 Android 中的唯一行?

    java - 有没有办法混合 AndroidX 和使用支持库的子项目?

    Java 套接字导致流过早结束

    ruby - xmpp4r 在登录时抛出异常 : "Exception caught in Parser thread! (Jabber::ServerDisconnected)"

    android - 如何使用 smack 4.1 的 XEP 198(流管理)?