Android ExecutorService没有';t在Runnable中调用run()

Android ExecutorService没有';t在Runnable中调用run(),android,executorservice,java.util.concurrent,asmack,Android,Executorservice,Java.util.concurrent,Asmack,我在Android的asmack库中遇到了一个奇怪的问题。库使用ExecutorService解析传入的数据包,如下所示: private ExecutorService listenerExecutor; listenerExecutor = Executors.newSingleThreadExecutor(new ThreadFactory() { public Thread newThread(Runnable runnable) { Thre

我在Android的asmack库中遇到了一个奇怪的问题。库使用ExecutorService解析传入的数据包,如下所示:

private ExecutorService listenerExecutor;

listenerExecutor = Executors.newSingleThreadExecutor(new ThreadFactory() {

        public Thread newThread(Runnable runnable) {
            Thread thread = new Thread(runnable,
                    "Smack Listener Processor (" + connection.connectionCounterValue + ")");
            thread.setDaemon(true);
            return thread;
        }
    });

(...)

listenerExecutor.submit(new ListenerNotification(packet));

(...)

/**
 * A runnable to notify all listeners of a packet.
 */
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);
        }
    }
}
在调用submit()方法之前,一切都正常,ListenerNotification的构造函数也被调用,但不再调用ListenerNotification中的run()方法


这可能是什么原因?ExecutorService中是否有一些机制可能导致调用提交被忽略?

正如预期的那样,故障在我这边

我在代码中实现了一个花名册数据包侦听器,并重写了processPacket方法:

@Override
public void processPacket(Packet packet) {
    if (packet instanceof RosterPacket) {
        RosterPacket rosterPacket = (RosterPacket) packet;
        Logger.d(LOGTAG, "Initial roster packet received: " + rosterPacket.getRosterItemCount());
        mConnection.removePacketListener(this);
        fireOnInitialRosterPacketReceived(rosterPacket);
    }
}
但是,我的内部侦听器调用方法引入了一个无限循环:

private void fireOnInitialRosterPacketReceived(RosterPacket rosterPacket) {
    Iterator<SessionListener> it = mSessionListeners.iterator();
    while (it.hasNext()) {
        // it.next().onInitialRosterPacketReceived(mConnection,
        // rosterPacket);
    }
}
private void fireOnInitialRosterPacketReceived(RosterPacket-RosterPacket){
Iterator it=mSessionListeners.Iterator();
while(it.hasNext()){
//it.next().onInitialRosterPacketReceived(mConnection,
//罗斯特帕克特);
}
}

这阻止了执行器启动的线程,因此后续的submit调用不会再次触发线程。

ListenerNotification.run()是否运行一次?您是否尝试使用默认的ThreadFactory而不是自己的ThreadFactory?是的,它会运行一段时间然后停止。这不是确定性的,也不是可复制的,这让我想知道。。。我没有对这个库代码做任何更改-我只在两个项目中使用它。我以前使用过同一个库,我没有这种性质的问题,现在它们出现了。我甚至从run()方法中迭代的侦听器列表中删除了我自己的侦听器,因为我认为我所做的任何事情都可能花费太长时间,但这也没有帮助。请尝试旧版本的lib,看看现在是否也发生了这种情况。可能单线程执行器处于某种“锁定”状态。这是我听说的第一个关于aSmack行为的报告。是的,这个线程实际上被我自己的代码阻塞了。