Обратные вызовы Paho-mqtt в разных классах android java

Я только что начал программировать Java для Android или даже программировать на Java в целом, и я хотел реализовать Android-сервис Paho MQTT, используя определенный класс MqttHandler, и я хочу установить обратный вызов в качестве параметра для класса MqttHandler. Другие ответы относительно обратных вызовов в целом предлагали использовать класс интерфейса, но я не знаю, как это работает. Это то, что я пробовал:

public interface InterfaceMqttCallback extends MqttCallbackExtended{
    @Override
    public void connectComplete(boolean b, String s);

    @Override
    public void connectionLost(Throwable throwable);

    @Override
    public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception ;

    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken);

}

конструктор класса MqttHandler:

public MqttHandler(Context context, InterfaceMqttCallback mqttCallbackExtended){
    mqttAndroidClient = new MqttAndroidClient(context, serverUri, clientId);
    mqttAndroidClient.setCallback(mqttCallbackExtended);
    connect();
}

функция в Activity, которая инициализирует MqttHandler:

private void startMqtt(){

    mqttHandler = new MqttHandler(getApplicationContext(), new InterfaceMqttCallback() {
        @Override
        public void connectComplete(boolean b, String s) {
            Log.w("Anjing", s);
        }

        @Override
        public void connectionLost(Throwable throwable) {

        }

        @Override
        public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
            Log.w("Anjing", mqttMessage.toString());
        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

        }
    });

}

Но, когда я проверял это, я думаю, что обратные вызовы не были установлены, потому что ни одно из сообщений не было получено. Итак, я попытался установить обратные вызовы непосредственно в MqttHandler, и это работает, сообщения принимаются.

public MqttHandler(Context context, InterfaceMqttCallback mqttCallbackExtended){
    mqttAndroidClient = new MqttAndroidClient(context, serverUri, clientId);
    mqttAndroidClient.setCallback(new InterfaceMqttCallback() {
        @Override
        public void connectComplete(boolean b, String s) {
            Log.w("mqtt", s);
        }

        @Override
        public void connectionLost(Throwable throwable) {

        }

        @Override
        public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
            Log.w("Anjing", mqttMessage.toString());
        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

        }
    });
    connect();
}

Так в чем проблема? Заранее спасибо..

РЕДАКТИРОВАТЬ: Конечно, я могу установить переменную mqttAndroidClient в классе MqttHandler как общедоступную, но безопасно ли это?


person Wildan Syahidillah    schedule 06.08.2016    source источник


Ответы (1)


Правильный способ установить обработчик обратного вызова — установить его в клиенте MQTT, например:

        public class MTTConnector { 
            public void connect {
              MqttAndroidClient mqttClient = new MqttAndroidClient(BaseApplication.getAppContext(), broker, MQTT_CLIENT_ID); 
              mqttClient.setCallback(new MqttCallbackHandler(BaseApplication.getAppContext()));
          }
        }

    public class MqttCallbackHandler implements MqttCallbackExtended {
    @Override
        public void connectComplete(boolean b, String s) {
            Log.w("mqtt", s);
        }

        @Override
        public void connectionLost(Throwable throwable) {

        }

        @Override
        public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
            Log.w("Anjing", mqttMessage.toString());
        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

        }
  }

Если вы используете последнюю версию, ваш обратный вызов должен реализовать класс MqttCallbackExtended, см. следующую ссылку для получения более подробной информации об онлайн-проекте GitHub.

MqttCallbackExtended.java

Внутри вашей активности инициализируйте MTTConnector и вызовите соединение.

Надеюсь на эту помощь.

Ваше здоровье !

person Sachin Thapa    schedule 07.08.2016
comment
Да, я расширяю класс MqttCallBackExtended, но я хочу разделить класс Activity и клиентский класс Mqtt, где я могу установить обратный вызов в классе Activity. Это сделано для того, чтобы я мог поместить весь бизнес Mqtt в один класс, кроме обратного вызова, потому что я хочу вызывать кучу классов-обработчиков в классе Activity. Я не хочу загромождать класс Activity кучей Mqtt. - person Wildan Syahidillah; 07.08.2016
comment
Да, вы не должны, пожалуйста, смотрите обновленный код. Внутри вашей активности инициализируйте MTTConnector и вызовите соединение. - person Sachin Thapa; 07.08.2016