утечка ServiceConnection org.eclipse.paho. android .service.MqttAndroidClient - PullRequest
0 голосов
/ 23 апреля 2020

Я создаю Android приложение, в этом приложении также есть функция для отправки данных по каналу MQTT.

Так что я собираю этот код для соединения с прерванным mqtt.

mqttAndroidClient = new MqttAndroidClient(this, MQTTConstants.MQTT_HOST, "namechannel");
        mqttAndroidClient.setCallback(new MqttCallbackExtended() {
            @Override
            public void connectComplete(boolean reconnect, String serverURI) {
                Log.d("mqtt connected :: ", serverURI);
            }

            @Override
            public void connectionLost(Throwable cause) {

            }

            @Override
            public void messageArrived(String topic, MqttMessage message) {
                Log.d("Message Arrival :: ", message.toString());
                String typeUser = PreferenceHandler.readString(ZephyrMqttService.this, PreferenceHandler.TYPE_USER, null);
                if (typeUser != null) {
                    if (typeUser.equalsIgnoreCase("3") || typeUser.equalsIgnoreCase("4")) {
                        String json = message.toString();
                        try {
                            JSONObject obj = new JSONObject(json);
                            JSONArray jsonArray = obj.getJSONArray("data");
                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject jsonObject = jsonArray.getJSONObject(i);
                                Gson gson = new Gson();
                                ecgDataListForRelative.add(gson.fromJson(jsonObject.toString(), Data.class));
                            }
                            Intent sendMQTTPackets = new Intent(AppConstants.RECIEVE_MQTT);
                            relativeRoleECGData = new RelativeRoleECGData();
                            relativeRoleECGData.setData(ecgDataListForRelative);
                            sendMQTTPackets.putExtra(AppConstants.EXTRA_RELATIVE_ROLE_MQTT_DATA, relativeRoleECGData);
                            sendBroadcast(sendMQTTPackets);
                            Log.e("My App", ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> hit broadcast");
                            // Toast.makeText(ZephyrMqttService.this, "mqtt data sent", Toast.LENGTH_SHORT).show();
                        } catch (Throwable t) {
                            Log.e("My App", "Could not parse malformed JSON: \"" + json + "\"");
                        }
                    }
                }
            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {
                if (token.isComplete()) {
                    try {
                        Log.d("Message Sent :: ", token.getMessage().toString());
                    } catch (MqttException e) {
                        e.printStackTrace();
                        Log.d("Message Sent :: ", token.getException().toString());
                    }
                }
            }
        });

        MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
        mqttConnectOptions.setAutomaticReconnect(true);
        mqttConnectOptions.setCleanSession(true);

        try {
            mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() {
                @Override
                public void onSuccess(IMqttToken asyncActionToken) {
                    DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions();
                    disconnectedBufferOptions.setBufferEnabled(true);
                    disconnectedBufferOptions.setBufferSize(100);
                    disconnectedBufferOptions.setPersistBuffer(false);
                    disconnectedBufferOptions.setDeleteOldestMessages(false);
                    mqttAndroidClient.setBufferOpts(disconnectedBufferOptions);
                    subscribeToTopic("/ecg/omniacare/devices/0X" + bioHarnessDeviceId, 0);
                    try{
                        subscribeToTopic("/rr/omniacare/devices/0X" + bioHarnessDeviceId, 0);
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                    try{
                        subscribeToTopic("/gen/omniacare/devices/0X" + bioHarnessDeviceId, 0);
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                    try{
                        subscribeToTopic("/dosimeter/omniacare/devices/0X" + bioHarnessDeviceId, 0);
                    }catch(Exception e){
                        e.printStackTrace();
                    }

                }

                @Override
                public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                    Log.w("Mqtt", "Failed to connect to: " + exception.toString());
                }
            });
        } catch (MqttException ex) {
            Log.e("MQTT", ex.getMessage());
        }catch (Exception ex) {
            Log.e("MQTT", ex.getMessage());
        }

Это работает, но иногда, когда приложение запускается и пытается соединиться с MQTT, не работает, я получаю это сообщение об ошибке:

E/ActivityThread: Service com.example.dcubeandroid.dietcontrol.mqtt.ZephyrMqttService has leaked ServiceConnection org.eclipse.paho.android.service.MqttAndroidClient$MyServiceConnection@bacf38f that was originally bound here
    android.app.ServiceConnectionLeaked: Service com.example.dcubeandroid.dietcontrol.mqtt.ZephyrMqttService has leaked ServiceConnection org.eclipse.paho.android.service.MqttAndroidClient$MyServiceConnection@bacf38f that was originally bound here
        at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:1538)
        at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:1430)
        at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1622)
        at android.app.ContextImpl.bindService(ContextImpl.java:1574)
        at android.content.ContextWrapper.bindService(ContextWrapper.java:697)
        at org.eclipse.paho.android.service.MqttAndroidClient.connect(MqttAndroidClient.java:425)
        at com.example.dcubeandroid.dietcontrol.mqtt.ZephyrMqttService.setupMQTT(ZephyrMqttService.java:326)
        at com.example.dcubeandroid.dietcontrol.mqtt.ZephyrMqttService.onCreate(ZephyrMqttService.java:241)
        at android.app.ActivityThread.handleCreateService(ActivityThread.java:3544)
        at android.app.ActivityThread.-wrap4(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1786)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6944)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
    --------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: it.bioresult.cardio, PID: 17697
    android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1881)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6944)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

Ошибка в этой строке кода, но я не могу перехватить и исправить ит.

mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...