有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java IMqttActionListener多次回调

我想创建一个后台运行的服务
这似乎很好,但当再次运行mqttprocess时,会多次调用onSuccess方法
首先->;发布一条消息
第二个->;发布两条消息
...
第四->;发布4条消息

locationScenes只有一个元素

public class MqttService {
   static IMqttActionListener actionListener = null;
   public static boolean RunMqttProcess(final Context context, final Config config, final Location location, final ArrayList<LocationScene> locationScenes) {
           String clientId = "ThoMi_" + getMacAddress();
           HashMap mqttConfig = config.getMqttConfig();
           Log.d(TAG, "clientId: " + clientId);
           final MqttAndroidClient mqttAndroidClient = new MqttAndroidClient(context, mqttConfig.get("url").toString(), clientId);
           MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
           mqttConnectOptions.setUserName(mqttConfig.get("userName").toString());
           mqttConnectOptions.setPassword(mqttConfig.get("password").toString().toCharArray());
           mqttConnectOptions.setCleanSession(true);
           for (final LocationScene locationScene : locationScenes) {final Double meter = Convert.measure(location.getLatitude(), location.getLongitude(), locationScene.getLatitude(), locationScene.getLongitude());
               Boolean conditionTime = checkConditions();
               //......
               if (conditionTime && meter < locationScene.getRadius() && 0 == locationScene.getControlled() && !locationScene.getDisabled()) {
                   locationScene.setControlled(System.currentTimeMillis());
                   LocationSceneDAO dao = DAOFactory.createLocationSceneDAO(context);
                   dao.editLocationScene(locationScene);
                   actionListener = null;
                   actionListener = 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);
                           try {
                               for (HashMap<String, String> device : locationScene.getDevices()) {
                                   MqttMessage message = new MqttMessage();
                                   message.setRetained(false);
                                   message.setPayload(device.get("message").getBytes());
                                   mqttAndroidClient.publish(device.get("topic"), message);
                                   if (!mqttAndroidClient.isConnected()) {
                                       Log.d(TAG, mqttAndroidClient.getBufferedMessageCount() + " messages in buffer.");
                                   }
                               }
                           } catch (MqttException e) {
                               Log.d(TAG, "[postMQTT]:  Error Publishing: " + e.getMessage());
                               e.printStackTrace();
                           }
                       }
                       @Override
                       public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                           Log.d(TAG, "[postMQTT]: Failed to connect to " + config.getMqttConfig().get("url"));
                       }
                   };
                   mqttAndroidClient.connect(mqttConnectOptions, null, actionListener);

               }
           }
           if (mqttAndroidClient.isConnected()) {
               mqttAndroidClient.disconnect();
           }
       } catch (MqttException e) {
           Log.d(TAG, e.getCause().getMessage());
       }
       return true;
   }
}

有什么问题吗


共 (1) 个答案

  1. # 1 楼答案

    可能会很晚,但请确保正在断开MQTT客户端的连接。我的问题是,每次我启动应用程序时,都会再次建立连接,因此多个客户端在同一clientID上连接