2016-08-06 11 views
2

私はJavaのAndroidプログラミングやJavaプログラミングを開始しましたが、特定の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(); 
} 

だから何が問題なのですか?ありがとうございます。

編集:もちろん、私はMqttHandlerクラスの変数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ビジネスを1つのクラスに入れることができるようにするためです。アクティビティクラスのハンドラクラスを呼び出したいからです。私はMqttの束でActivityクラスを混乱させたくありません。 –

+0

はい、あなたはいらない、更新されたコードを見てください。アクティビティの中でMTTConnectorを初期化し、connectを呼び出します。 –

関連する問題