Java Android Paho Mqtt-close()v.s.unregisterResources()-OutOfMemoryError
每当我在paho MQTT客户机中遇到错误时,我都会在60秒后尝试重新连接: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) {
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)
}
}