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人のユーザーがグループでメッセージを送信すると、user2はメッセージを受信できません.しかし、ユーザー 2 がこのグループ内でメッセージを送信すると、両方ともメッセージを受信できます。

助けてください、解決策が見つかりません。すでに廃止されている提案をしないでください。

前もって感謝します。!!

4

2 に答える 2

1

完全なコードレビューの後、完全に編集しています。-また-

コードをリファクタリングして、複数の巨大なクラスで役割を分離することをお勧めします。

基本的に、コード内の多くの「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); リスナーは 1 回追加する必要があります。そうしないと、大量のスレッドが作成されます。シングルトンがあるため、おそらく機能します。リスナーがいる間は、削除しない限り、そのチャットに追加する必要はありません。

  1. mConnection.addSyncStanzaListener(this, null); 注意してください:接続にリスナーを追加しています(どれですか?同じクラスで大量のリスナーを実装しています)。コードが重要なスタンザ (カスタム 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 に答える