android – Smack数据包侦听器未运行

前端之家收集整理的这篇文章主要介绍了android – Smack数据包侦听器未运行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试为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));

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

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

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

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

解决方法

如果您的其他数据包侦听器正在抛出异常,则会发生这种情况.
每当一个数据包进入某个线程中的所有数据包侦听器的命中时,就会出现一个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相关文章