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

标签 android multithreading smack

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/

相关文章:

android - 无法接收 UsbManager.ACTION_USB_DEVICE_ATTACHED/UsbManager.ACTION_USB_DEVICE_DETACHED 的广播 Intent

android - 当 DATE_ADDED 为 0 时,使用 DATE_ADDED 而不是 DATE_TAKEN 对查询进行排序

java - 有没有办法防止 ClosedByInterruptException?

java - 从 Android 应用程序在 openfire 上创建一个组

android - smack 4.2.0 错误 : IN AAAA yielded an error response NX_DOMAIN

java - 使用 Smack 库在端口上监听 XMPP 连接

java - 有没有办法使用 InputMethodManager 强制键盘为数字?

Android Mapbox 地理编码

java - interned 字符串上的嵌套同步块(synchronized block)

iphone - 有没有办法强制核心动画运行它的线程?