当大量消息(正常消息和延迟响应消息)进入android客户端时,smack会创建100〜200个睡眠的Smack Cache Executor线程。线程的这种突然涌入导致android客户端变得无响应(ANR错误)。
在正常操作下,至少会有2个Smack Cache Executor线程,并且该应用程序将总共使用50-60个线程。
类型为延迟的脱机存储的消息被处理为“灵活的脱机消息检索”协议。但是,那些普通消息和延迟响应消息似乎没有任何特殊协议,并且线程数涌入还没有明确的解决方案。
这里的大量邮件是指600多个重发邮件和几秒钟内收到的普通邮件。
在此问题上的任何帮助或建议都将受到赞赏。提前谢谢了!
对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线程数增加:
答案 0 :(得分:0)
应该在使用同步节监听器时使用异步节监听器。
最终,您应该能够找到确切的侦听器(假设它实际上是由StanzaListener
引起的,但即使现在还没有得到验证),它会创建所有这些线程。如果您确定它是Smack设置的侦听器,那么您可能应该在Smack社区论坛中将其报告为问题。如果这是您设置的侦听器,则可能要使用同步侦听器或Smack的AsyncButOrdered
实用程序来减少线程数。