报错如下
Service org.eclipse.paho.android.service.MqttService has leaked IntentReceiver org.eclipse.paho.android.service.AlarmPingSender$AlarmReceiver@3e3af5b that was originally registered here. Are you missing a call to unregisterReceiver()?
错误分析
在断开disconnect的时候,需要解注册mqttAndroidClient的广播;因为mqttAndroidClient本身就是一个广播。但是广播本身就是系统的底层通信,属于异步操作,然后接着调用disconnect就会导致广播还没有解注册就进行diconnect,会出现上述报错。
解注册广播需要调用unregisterResources方法。
解决方案
在调用disconnect()方法前,主动调用unregisterResources()方法来解注册广播
public void disconnect() {
try {
mqttClient.unregisterResources();
mqttClient.disconnect(null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
Log.d(TAG, "Disconnected");
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Log.d(TAG, "Failed to disconnect");
}
});
} catch (MqttException e) {
throw new RuntimeException(e);
}
}