创建了太多的Smack Cache Executor线程

时间:2018-12-06 03:25:35

标签: android multithreading smack

简易版:4.2.4

当大量消息(正常消息和延迟响应消息)进入android客户端时,smack会创建100〜200个睡眠的Smack Cache Executor线程。线程的这种突然涌入导致android客户端变得无响应(ANR错误)。

在正常操作下,至少会有2个Smack Cache Executor线程,并且该应用程序将总共使用50-60个线程。

类型为延迟的脱机存储的消息被处理为“灵活的脱机消息检索”协议。但是,那些普通消息和延迟响应消息似乎没有任何特殊协议,并且线程数涌入还没有明确的解决方案。

这里的大量邮件是指600多个重发邮件和几秒钟内收到的普通邮件。

在此问题上的任何帮助或建议都将受到赞赏。提前谢谢了!

编辑1:

对XMPP的连接经过身份验证后,将设置3节侦听器。一种用于状态,一种用于消息,一种用于智商。它们如下:

public void addPresenceStanzaListener(){
    if (presenceStanzaListener != null) {
        connection.removeSyncStanzaListener(presenceStanzaListener);
    }

    StanzaFilter presenceStanzaFilter = new StanzaTypeFilter(Presence.class);

    presenceStanzaListener = new StanzaListener() {
        @Override
        public void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException {
        //Process presence stanza
        }
    };
    connection.addSyncStanzaListener(presenceStanzaListener, presenceStanzaFilter);
}

public void addMessageStanzaListener(){
    if (messageStanzaListener != null) {
        connection.removeSyncStanzaListener(messageStanzaListener);
    }

    StanzaFilter messageStanzaFilter = new StanzaTypeFilter(Message.class);
    messageStanzaListener = new StanzaListener() {
        @Override
        public void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException {
        //Process message stanza
        }
    };

    connection.addSyncStanzaListener(messageStanzaListener, messageStanzaFilter);
}

public void addIQStanzaListener(){
    if (iqStanzaListener != null) {
        connection.removeSyncStanzaListener(iqStanzaListener);
    }

    StanzaFilter iqStanzaFilter = new StanzaTypeFilter(IQ.class);
    iqStanzaListener = new StanzaListener() {
        @Override
        public void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException {
        //Process IQ stanza
        }  
    };

    connection.addSyncStanzaListener(iqStanzaListener, iqStanzaFilter);
}

如何触发Smack Cache Ex线程数增加:

  1. 关闭Internet连接
  2. 垃圾邮件600余封
  3. 重新打开Internet连接(就ejabberd而言,Android客户端从未断开连接)
  4. 客户端连接到XMPP后,Smack Cache Ex线程数至少增加100。

1 个答案:

答案 0 :(得分:0)

应该在使用同步节监听器时使用异步节监听器。

最终,您应该能够找到确切的侦听器(假设它实际上是由StanzaListener引起的,但即使现在还没有得到验证),它会创建所有这些线程。如果您确定它是Smack设置的侦听器,那么您可能应该在Smack社区论坛中将其报告为问题。如果这是您设置的侦听器,则可能要使用同步侦听器或Smack的AsyncButOrdered实用程序来减少线程数。