4

smackx API を使用して MultiUserChat を実装しようとしています。

これまでのところ、新しい MultiUserChat ルームを作成して参加し、招待状を送信することができました。今のところ私の問題は、誰かがチャット ルームに参加したか、チャット ルームを離れた場合に、チャット ルームに誰がいるかを調べる方法です。プレゼンス リスナーをチャット ルームに追加するとうまくいくのではないかと考えました。

muc.addParticipantListener(new PacketListener() {

    @Override
    public void processPacket(Packet packet) {
        System.out.println("user count changed, now:" + muc.getOccupcantsCount());
    }
});

addParticipantListener状態の Javadoc

グループ チャットに新しいプレゼンス パケットが送信されると通知されるパケット リスナーを追加します。リスナの使用は、変更によって占有者のリストをいつ再ロードする必要があるかを知るための適切な方法です。

だから、これはうまくいくだろうと思った。ただし、processPacketメソッド内でmuc.getOccupantsCount()muc.getOccupants()両方とも、呼び出しの前に値を返しprocessPacketます。したがって、チャット ルームに 1 人のユーザーしかいない場合、別のユーザーが参加すると、出力は次のようになります。

ユーザー数が変更されました。現在: 1

2 人のユーザーがいて、別のユーザーが参加している場合、出力は次のようになります。

ユーザー数が変更されました。現在: 2

3 人のユーザーと 1 人のユーザーがいる場合、出力は次のようになります。

ユーザー数が変更されました。現在: 3

それぞれ、muc.getOccupants()内で呼び出されたときに参加したばかりのユーザーは表示さprocessPacketれませんが、離れたばかりのユーザーは表示されます。

現在チャット ルームにいる人を 内から効果的に見つけるにはどうすればよいprocessPacketですか?

4

3 に答える 3

3

できません。PacketListenerおよび内にありませんmuc.getOccupantsCount()

占有者数もsmackx 内の aを使用して決定されPacketListenerます。また、これがあなたの前に実行されることは保証されていないPacketListenerため、占有数を更新する可能性があります。

今すぐ解決する方法の 1 つは、プレゼンス パケットを調べて、現在のメンバー リストと照合することです。基本的に、組み込みのプレゼンス リスナーと同じことを行います。または、人為的にアクションを遅らせて、全員PacketListenersが終了できるようにすることもできます。

Smack でこの問題を追跡するために、SMACK-424を作成しました。

于 2013-03-06T12:51:14.670 に答える