Java Android Paho Mqtt-close()v.s.unregisterResources()-OutOfMemoryError

Java Android Paho Mqtt-close()v.s.unregisterResources()-OutOfMemoryError,java,android,kotlin,mqtt,paho,Java,Android,Kotlin,Mqtt,Paho,每当我在paho MQTT客户机中遇到错误时,我都会在60秒后尝试重新连接: override fun connectionLost(cause: Throwable) { LOG.e("Connection Lost :: $cause") cleanupClient() retry { connect() } } private fun cleanupClient(){ try { for (i in topicList.indices) {

每当我在paho MQTT客户机中遇到错误时,我都会在60秒后尝试重新连接:

override fun connectionLost(cause: Throwable) {
    LOG.e("Connection Lost :: $cause")
    cleanupClient()
    retry { connect() }
}

private fun cleanupClient(){
    try {
        for (i in topicList.indices) {
            client!!.unsubscribe(topicList[i])
        }
        client!!.close()
        client = null
    } catch (e: Exception) {
        LOG.e("Could not clean up!", e)
    }
}

fun retry(cb: () -> Unit){
    handler.removeCallbacksAndMessages(null)
    handler.postDelayed({
        cb()
    }, 60000)
}
因此,如果应用程序没有互联网,它将不断尝试重新连接,直到最后连接。问题是,在数百次尝试(几个小时)后,应用程序因内存不足而崩溃:

java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack available
我只有2个类全局变量,我的处理程序和MqttAndroidClient:

private var client: MqttAndroidClient? = null

// For retries
val handler = Handler()
其中,只有客户被重新分配了一个值。我的理解是,在cleanup函数中,由于我关闭并清空了客户机,JVM应该清理我的资源。client.close()的文档:

关闭客户端释放与客户端关联的所有资源。 关闭客户端后,无法重新使用它。例如 尝试连接将失败

还有另一个名为unregisterResources()的函数

取消注册从MqttService接收意图的接收器 内部接收器泄漏

在我看来,似乎只需要调用client.close(),但我不确定这是否会导致其他问题


如果你还有什么建议让我看看,我会喜欢你的建议

客户端内部某个地方出现内存泄漏。因此,无论是否使用close,每次出现问题时重新创建客户端最终都会导致应用程序崩溃

当我以这种方式构建应用程序时,我在SO()上忽略了这个答案。正如@hardillb所指出的,这已经过时了。相反,请使用重新连接回调:

conOpt.isAutomaticReconnect = true
在类上实现MqttCallbackExtended:

class NotificationService : Service(), MqttCallbackExtended {
然后实现connectComplete() 覆盖完成(unuseadarg1:Boolean,unuseadarg2:String?){


当泛美卫生组织的安卓服务将为你重新连接时,为什么要手动执行此操作?他们的自动重新连接无法正常工作,也无法自动重新订阅,因此我需要处理它。另一篇帖子说了类似的话——实现你自己的重新连接逻辑:这已经4年了(事情发生了变化),与安卓也没有任何关系
LOG.i("Connection completed!")
        try{
            subscribe()
        } catch(e: java.lang.Exception){
            LOG.e("Unable to re-subscribe", e)
        }
    }