Smack 数据包侦听器未运行

Posted

技术标签:

【中文标题】Smack 数据包侦听器未运行【英文标题】:Smack Packet Listener Not Running 【发布时间】:2012-11-02 15:59:38 【问题描述】:

我正在尝试为 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,或者侦听器是否会以某种方式死亡。有谁知道为什么这不会收到数据包?任何有关此主题的知识将不胜感激!

【问题讨论】:

【参考方案1】:

如果您的其他数据包侦听器之一抛出异常,这将很快发生。 每当一个数据包进来时,一个线程中的所有数据包侦听器都会受到打击,在一个 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);
        
    

【讨论】:

【参考方案2】:

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

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

【讨论】:

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

以上是关于Smack 数据包侦听器未运行的主要内容,如果未能解决你的问题,请参考以下文章

所有数据包的一个侦听器与处理特定类型的单独侦听器

Smack MUC 邀请

aSmack - 使用数据包侦听器输出可空元素的数据包到 XML

XMPP Smack 4.1.1 UnsupportedIQ 错误

asmak 数据包侦听器和自定义 IQProvider 未触发/调用

未调用 XEP-0022 的 SMACK 消息侦听器