4

Android XMPP 統合に asmack API を使用しています...

xmpp 接続の認証が成功した後、着信メッセージの通知に PacketListener を使用しました。

私のアプリケーションはタブベースのアプリケーションです。フレンド リストをクリックしてチャット アクティビティに移動すると、パケット リスナーが OnCreate メソッドの接続に追加されます。

問題は、この画面に何度も移動すると、その数のリスナーが追加され、同じメッセージが複数回表示されることです。

この問題の解決策はありますか?

PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
        PacketListener pListener = new PacketListener() {
            public void processPacket(Packet packet) {
                Message message = (Message) packet;
                if (message.getBody() != null) {
                    String fromName = StringUtils.parseBareAddress(message
                            .getFrom());
                    Log.i("XMPPClient", "Got text [" + message.getBody()
                            + "] from [" + fromName + "]");
                    messages.add(fromName + ":");
                    messages.add(message.getBody());
                    // Add the incoming message to the list view
                    mHandler.post(new Runnable() {
                        public void run() {
                            setListAdapter();
                        }
                    });
                }
            }
        };

        connection.addPacketListener(pListener, filter);
4

5 に答える 5

5

@Vishal。このリスナーをアクティビティファイルに追加するのではなく、Androidサービスにこれらのリスナーを追加するだけで、常に単一のインスタンスで実行する必要があります。

ありがとう

于 2013-03-11T05:36:14.993 に答える
2

同じ問題が発生しました。これは私がしたことです、

OnResume()
{
connection.removePacketListener(yourlistener);
}
于 2013-04-19T18:26:24.663 に答える
2

アプリの構造を完全に把握しているかどうかはわかりませんが、適切な場合にXMPPConnection.removePacketListener()を呼び出してみませんか?

于 2011-05-02T08:28:22.443 に答える
1

アクティビティのライフサイクルにリスナーを登録しないでください。代わりに、接続コントローラーのシングルトンを作成し、このリスナーをそのコントローラーに追加します。

于 2014-08-29T13:22:37.370 に答える
0

ChatManagerより良い方法は、チャットの管理、チャットの送受信に依存することだと思います。これは、私のアプリで行うことです。

// Assume we've created a Connection name "connection".
ChatManager chatmanager = connection.getChatManager();
Chat newChat = chatmanager.createChat("jsmith@jivesoftware.com",
 new MessageListener() {
    public void processMessage(Chat chat, Message message) {
        System.out.println("Received message: " + message);
    }
});

try {
    newChat.sendMessage("Howdy!");
}
catch (XMPPException e) {
    System.out.println("Error Delivering block");
}

あなたが述べたメッセージを受け取るために

// Assume a MessageListener we've setup with a chat.

    public void processMessage(Chat chat, Message message) {
        // Send back the same text the other user sent us.
        chat.sendMessage(message.getBody());
    }

他の着信チャットをリッスンする

// Assume we've created a Connection name "connection".
ChatManager chatmanager = connection.getChatManager().addChatListener(
    new ChatManagerListener() {
        @Override
        public void chatCreated(Chat chat, boolean createdLocally)
        {
            if (!createdLocally)
                chat.addMessageListener(new MyNewMessageListener());;
        }
    });

これにより、パケットフィルターよりもクリーンになります

複数のイベントリスナーの登録を回避するには、リスナーをonResume()メソッドに登録してから、登録を解除します。onPause()

于 2011-12-28T14:57:23.043 に答える