Smack 版本:4.2.4
当大量消息(普通消息和延迟重发消息)进入android客户端时,smack会创建100~200个休眠的Smack Cache Executor线程。这种线程的突然涌入导致 android 客户端变得无响应(ANR 错误)。
在正常操作下,至少会有 2 个 Smack 缓存执行器线程,应用程序将使用总共 50-60 个线程进行操作。
延迟离线存储类型的消息由“灵活的离线消息检索”协议(protocol)处理。然而,那些正常的和延迟重发的消息似乎没有任何特殊的协议(protocol),并且没有针对线程数涌入的明确解决方案。
这里的大量消息指的是600+条重发消息和秒内传入的正常消息。
非常感谢您就此事提供的任何帮助或建议。提前谢谢了!
编辑 1:
当与 XMPP 的连接通过身份验证时,将设置 3 节监听器。一种用于 Presence,一种用于 Message,一种用于 IQ。它们如下:
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 线程数增加:
- 关闭互联网连接
- 垃圾邮件 600 多封
- 重新打开互联网连接(此时,从 ejabberd 的角度来看,android 客户端从未与它断开连接)
- 当客户端连接到 XMPP 时,Smack Cache Ex 线程数至少增加 100。
最佳答案
当您应该使用同步的时,您可能会使用异步的节监听器。
最终您应该能够找到确切的监听器(假设它是实际上是由 StanzaListener
引起的,但即便如此现在也未得到验证)这是创建所有这些线程。如果您确定它是由 Smack 设置的监听器,那么您应该将其报告为 Smack 社区论坛中的问题。如果它是由您设置的监听器,那么您可能希望使用同步监听器或 Smack 的 AsyncButOrdered
实用程序来减少线程数。
关于android - 创建的 Smack Cache Executor 线程过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53644179/