android - Smack 数据包监听器未运行

标签 android xmpp asmack

我正在尝试为 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 是 asmack IQ。大多数情况下,这段代码都可以正确运行。但有时 PacketListener 只是没有收到发送的数据包。我想知道我是否应该改用 PacketCollector,或者听众是否正在以某种方式死亡。有谁知道为什么这不会收到数据包?任何有关此主题的知识将不胜感激!

最佳答案

如果您的其他数据包监听器之一抛出异常,这将在 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);
        }
    }
}

关于android - Smack 数据包监听器未运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13198840/

相关文章:

android - aSmack 错误 : XMPPConnection is abstract; cannot be instantiated

Android asmack : stateChange never called

android - 将 mp3 文件从 Kiosk 直接传输到智能手机

android - 如何使用linearLayout设置onClick方法?

ios - XMPPFramework - 消息未发送

iphone - XMPP 身份验证返回是,但从未调用 XMPPStreamDidAuthenticate

java - Android XMPP 连接不是持久的 - asmack 库甚至在单独的线程中运行

android - Android 的这个音频流播放代码有什么问题?

java - android sql-query 问题..."no such column"?

ios - 有没有使用 XMPP 添加和自动接受好友的好方法?