2016-08-06 2 views
2

방금 ​​자바 안드로이드 프로그래밍 또는 자바 프로그래밍을 시작했으며 특정 MqttHandler 클래스를 사용하여 Paho MQTT Android 서비스를 구현하고자했습니다. 콜백을 다음과 같이 설정하려고합니다. MqttHandler 클래스의 매개 변수 콜백에 관한 다른 답변은 일반적으로 인터페이스 클래스를 사용하는 것이 좋지만 어떻게 작동하는지 모르겠습니다. 이것은 내가 시도 것입니다 :다른 클래스의 Paho-mqtt 콜백 java

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

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

그래서 무엇이 문제입니까? 미리 감사드립니다 ...

EDIT : 당연히 MkttHandler 클래스의 mqttAndroidClient 변수를 public으로 설정할 수 있지만 안전합니까?

답변

0

콜백 핸들러를 설정하는 적절한 방법은 다음과 같이, 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를 초기화하고 연결 호출합니다.

이 도움말을 참조하십시오.

건배!

+0

그래, 나는 MqttCallBackExtended 클래스를 확장하고 있는데, 내가 수행하고자하는 것은 액티비티 클래스와 액티비티 클래스에서 콜백을 설정할 수있는 Mqtt 클라이언트 클래스를 분리하는 것이다. 이것은 콜백을 제외하고 하나의 클래스에 모든 Mqtt 비즈니스를 넣을 수 있기 때문에 Activity 클래스에서 많은 수의 핸들러 클래스를 호출하기를 원하기 때문이다. 나는 Mqtt의 무리로 Activity 클래스를 혼란스럽게하고 싶지 않다. –

+0

예, 업데이트되지 않은 코드를 참조하십시오. 활동 내에서 MTTConnector를 초기화하고 connect를 호출하십시오. –

관련 문제