gpt4 book ai didi

android - 创建的 Smack Cache Executor 线程过多

转载 作者:行者123 更新时间:2023-11-30 05:11:32 27 4
gpt4 key购买 nike

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 线程数增加:

  1. 关闭互联网连接
  2. 垃圾邮件 600 多封
  3. 重新打开互联网连接(此时,从 ejabberd 的角度来看,android 客户端从未与它断开连接)
  4. 当客户端连接到 XMPP 时,Smack Cache Ex 线程数至少增加 100。

最佳答案

当您应该使用同步的时,您可能会使用异步的节监听器。

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

关于android - 创建的 Smack Cache Executor 线程过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53644179/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com