Java Android:我的mqtt服务器未断开连接

Java Android:我的mqtt服务器未断开连接,java,android,protocols,mqtt,Java,Android,Protocols,Mqtt,当用户终止应用程序时,我的mqtt服务器不会断开连接。还有其他用户可以看到状态是在线的。关闭应用程序后,我需要断开mqtt服务器 1) 我的第一次连接成功 2) 关闭应用程序后,mqtt不会断开连接 3) 如果有人发送消息,它会自动重新订阅 private static BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, In

当用户终止应用程序时,我的mqtt服务器不会断开连接。还有其他用户可以看到状态是在线的。关闭应用程序后,我需要断开mqtt服务器

1) 我的第一次连接成功

2) 关闭应用程序后,mqtt不会断开连接

3) 如果有人发送消息,它会自动重新订阅

private static BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (LBUtil.isNetworkAvailable(context)) {
            if (BuildConfig.DEBUG) {
                LBLog.v(TAG, "network is available now");
            }

        }
    }
};

@Override
public IBinder onBind(Intent arg0) {
    return null;
}
在这里启动mqtt服务

@Override
public void onCreate() {
    super.onCreate();
    LBLog.v(TAG, "start mqtt service");

    mApp = (LBApplication) this.getApplicationContext();
    mHandler = LBMessageManager.messageHandler;
    mServerUri = LBUtil.getMqttBrokerUrl(this);

    // register re-subscribe listener
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(LBMessageManager.ACTION_MQTT_SUBSCRIBE);

    receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            LBLog.v(TAG, "re-subscribe mqtt");
            isConnected = false;
            if(!mMqttClient.isConnected()){
                subscribeMqttTopic();               
            }


        }
    };
    registerReceiver(receiver, intentFilter);

    subscribeMqttTopic();
}

private void subscribeMqttTopic() {

    subscriberThread = new Thread(new Runnable() {
        public void run() {

            do {
                try {
                    mClientId = mApp.getDeviceToken() == null? mApp.getAuthToken():mApp.getDeviceToken();
                    mTopic = mApp.getSecretKey() + mApp.getUserId();
                    mWillTopic = mApp.getSecretKey() + mApp.getPartnerId();

                    if(mServerUri == null){
                        LBLog.e(TAG, "mServerUri is null");
                    }
                    if(mClientId == null){
                        LBLog.e(TAG, "mClientId is null");
                    }

                    if(mMqttClient == null){
                        mMqttClient = new MqttClient(mServerUri, mClientId, null);
                    }

                    Messenger messenger = new Messenger(mHandler);
                    LBMessageCallback callback = new LBMessageCallback(mApp, messenger);

                    mMqttClient.setCallback(callback);

                    final MqttConnectOptions options = new MqttConnectOptions();
                    options.setCleanSession(false);
                    options.setUserName(LBUtil.getMqttServerUsername(mApp));
                    options.setPassword(LBUtil.getMqttServerPassword(mApp).toCharArray());

                    // set will message
                    LBMqttMessage mqttMessage = new LBMqttMessage();
                    mqttMessage.setFrom(mApp.getUserId());
                    mqttMessage.setTo(mApp.getPartnerId());
                    mqttMessage.setType(LBMessageManager.TYPE_STATUS);
                    mqttMessage.setState(LBMessageManager.STATE_INACTIVE);

                    ObjectMapper mapper = new ObjectMapper();
                    mapper.registerModule(new JodaModule());

                    String jsonString = null;
                    try {
                        FilterProvider filters = new SimpleFilterProvider().addFilter("lbMqttMessageFilter", SimpleBeanPropertyFilter.filterOutAllExcept("state", "to", "from"));
                        jsonString = mapper.writer(filters).writeValueAsString(mqttMessage);
                        LBLog.v(TAG, "will message=" + jsonString);
                    } catch (JsonProcessingException e) {
                        LBLog.e(TAG, "enableMqtt", e);
                    }

                    options.setWill(mMqttClient.getTopic(mWillTopic), jsonString.getBytes(), LBMessageMqtt.QOS_1, false);

                    // connect
                    mMqttClient.connect(options);

                    // subscribe
                    LBLog.v(TAG, "Subscribing mTopic=" + mTopic);
                    mMqttClient.subscribe(mTopic);

                    LBLog.v(TAG, "subscribe success");
                    isConnected = true;

                } catch (MqttException e) {
                    Log.v(TAG, e.toString());
                    isConnected = false;

                    try { // wait some time before retry
                        Thread.sleep(5000);
                    } catch (InterruptedException e1) {
                        Log.v(TAG, e1.toString());
                    }

                }
            } while (isConnected == false);

        }
    });

    subscriberThread.start();

}

@Override
public void onDestroy() {
    super.onDestroy();
    LBLog.v(TAG, "destroying mqtt service...");
    unregisterReceiver(receiver);
    if(mMqttClient != null && mMqttClient.isConnected()){
        try {
            mMqttClient.disconnect();
        } catch (MqttException e) {
            LBLog.e(TAG, "onDestroy", e);
        }
    }
}

}

退出应用程序时,应手动完成服务。还有一个来自广播的呼叫,我们没有看到它的代码

LBUtil.isNetworkAvailable(context)
确保此设备不会再次启动您的服务