Android Smack数据包侦听器未运行

Android Smack数据包侦听器未运行,android,xmpp,asmack,Android,Xmpp,Asmack,我正在尝试为asmack数据包编写侦听器。最终的结果是,侦听器有时无法获取数据包并对其进行处理。下面是一些代码: try { XMPPMethods.getConnection().addPacketListener( new PacketListener() { @Override public synchronized void processPacket(Packet packet)

我正在尝试为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(字符串…参数)部分的内部

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

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

其中JIDIQ是一个asmack智商。这段代码大部分时间都能正确运行。但是有时候PacketListener就是不接收发送的数据包。我想知道我是否应该用一个PacketCollector来代替,或者听众是否不知何故正在死去。有人知道为什么这个不能收到包裹吗?对这门学科的任何知识都将不胜感激

我认为PacketIDFilter正在过滤数据包,因此您的数据包侦听器无法获取它们


当您的数据包侦听器未获取数据包时,请检查smack日志,查看数据包ID是否符合数据包筛选器的要求。

如果您的其他数据包侦听器之一引发异常,则smack中会发生这种情况。
每当一个包传入时,一个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);
        }
    }
}

我已经对此进行了测试,包ID始终与筛选器ID匹配。我还尝试使用常量作为ID,并使用不同类型的筛选器。所有三个过滤器设置都得到相同的结果。注意:进入活动时,如果第一次收到数据包,那么无论我查询IQ多少次并发送数据包,每次都会工作。反过来也是如此,当我输入活动时,数据包没有被侦听器接收到,所有未来的IQ数据包都不会被侦听器接收到。@JonathanCornwell您是否检查了注册侦听器的连接是否与接收数据包的连接相同?(例如,客户端断开连接,然后重新连接,因为连接发生变化,但新连接没有侦听器)我也测试过,但连接从未改变。我甚至让所有活动都可以访问连接的公共版本,以确保连接不会以相同的结果更改。更新:似乎当我打开活动并且侦听器运行时,它将为发送给它的每个数据包正确运行。但是当侦听器不运行时,它不会对发送给它的每个数据包都运行。关闭和重新打开活动可以改变这一点(工作/不工作),但奇怪的是,打开/关闭活动不会改变任何影响听者的事情。