5

asmackパケットのリスナーを作成しようとしています。最終的に発生するのは、リスナーがパケットを取得して処理しない場合があります。コードの一部を次に示します。

try {

            XMPPMethods.getConnection().addPacketListener( new PacketListener() {
                    @Override
                    public synchronized void processPacket(Packet packet) {

                        if (packet.getPacketID().equals(lastCustomIQId)) {

                            android.os.Message msg = new android.os.Message();
                            msg.obj = privateData;
                            msg.what = XMPPMethods.ADD_CONTACT_RESULTS;
                            AddContact.addContactHandler.sendMessage(msg);
                        }
                    }
                }, new PacketIDFilter(lastCustomIQId));

これは、非同期タスクのdoInBackground(string ... params)部分の内部にあることに注意してください。

パケットは以下を使用して送信されています:

JIDIQ.setPacketID(lastCustomIQId);
JIDIQ.setFrom(XMPPMethods.getCurrentUserFullUserName());
JIDIQ.setType(Type.GET);
XMPPMethods.getConnection().sendPacket(JIDIQ);

JIDIQがasmackIQである場合。このコードはすべて、ほとんどの場合正しく実行されます。ただし、PacketListenerが送信されたパケットを受信しない場合があります。代わりにPacketCollectorを使用する必要があるのか​​、それともリスナーがどういうわけか死にかけているのか疑問に思っています。なぜこれがパケットを受信しないのか誰かが知っていますか?この主題についての知識があれば大歓迎です!

4

2 に答える 2

2

これは、他のパケットリスナーの1つが例外をスローしている場合に発生します。
パケットが到着すると、1つのforループ内で、1つのスレッド内のすべてのパケットリスナーにヒットが発生します。パケットリスナーで例外がスローされた場合、これはそのスレッドを中止し、それ以上のパケットリスナーはトリガーされません。

これが発生している場所を検出する最も完全な方法は、smackを再コンパイルし、にエラーハンドラを追加することPacketReader.javaです。

これがコードの関連セクションです。エラー処理がないため、スローされた例外によってスレッドが中止されることがわかります。

private class ListenerNotification implements Runnable {

    private Packet packet;

    public ListenerNotification(Packet packet) {
        this.packet = packet;
    }

    public void run() {
        for (ListenerWrapper listenerWrapper : connection.recvListeners.values()) {
            listenerWrapper.notifyListener(packet);
        }
    }
}
于 2013-05-03T12:30:32.110 に答える
1

PacketIDFilterがパケットをフィルタリングしているので、パケットリスナーはパケットを取得しないと思います。

パケットリスナーがパケットを取得しない場合は、スマックログをチェックして、パケットIDがパケットフィルターが期待するものであるかどうかを確認します。

于 2012-11-17T00:29:40.483 に答える