android调用MqttAndroidClient.disconnect()报错MqttService has leaked IntentReceiver

1,102 阅读1分钟

报错如下

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);
    }
}