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));

请注意,这是在 asynctask 的 doInBackground(string... params) 部分内。

正在使用以下方式发送数据包:

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

JIDIQ 是一个 asmack IQ。这段代码大部分时间都正确运行。但有时 PacketListener 只是没有收到发送的数据包。我想知道我是否应该改用 PacketCollector,或者侦听器是否会以某种方式死亡。有谁知道为什么这不会收到数据包?任何有关该主题的知识将不胜感激!

4

2 回答 2

2

如果您的其他数据包侦听器之一抛出异常,这将发生。
每当一个数据包进来时,一个线程中的所有数据包侦听器都会受到打击,在一个 for 循环内。如果在数据包侦听器中引发异常,这将中止该线程并且不会触发进一步的数据包侦听器。

检测发生这种情况的最彻底的方法是重新编译 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 正在过滤数据包,因此您的数据包侦听器没有得到它们。

当您的数据包侦听器没有收到数据包时,请检查 smack 日志以查看数据包 ID 是否是数据包过滤器所期望的。

于 2012-11-17T00:29:40.483 回答