2017-02-07 9 views
1

Paho Android MQTTクライアントを使用してインスタントメッセージングシステムを作成しています。その実装は期待通りに機能しますが、私はこれらのエラーに直面しています。MQTTはonCreateが複数回呼び出されたときに複数の接続を作成します

MainActivity ClassonCreateにあるConnection Class(これはブローカへの接続の作成も必要です)と呼びます。

問題は、私がMainActivity Classにいると仮定して、MainActivity Classから別のアクティビティに移動し、後でMainActivity Classに戻り、別のブローカ接続が作成されます。これは、1つのメッセージが公開されるたびに、クライアントはメッセージを2度受信することを意味します。

MainActivity.java:

パブリッククラスMainActivity延びAppCompatActivity {

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.chat_intera); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    dbHelper = DatabaseManager.getInstance(context); 
    //mRecyclerView = (RecyclerView) findViewById(R.id.history_recycler_view); 

    connections = new Connections(); 
    connections.createConnectionForPublishing(context); 

} 


@Override 
public void onDestroy() { 
    super.onDestroy(); 
    System.out.println("LOG: Service destroyed"); 
} 

}

Connection.java

public class Connection { 

    public void createConnectionForPublishing (final Context context) { 

     //Instantiate the mqtt android client class 
     mqttAndroidClient = new MqttAndroidClient (context.getApplicationContext(), serverUri, clientId); 


     mqttAndroidClient.setCallback (new MqttCallbackExtended() { 

      @Override 
      public void connectComplete(boolean reconnect, String serverURI) { 
       if (reconnect) { 
        System.out.println ("Reconnected to : " + serverURI); 
       } else { 
        System.out.println ("Connected to: " + serverURI); 
       } 
      } 

      @Override 
      public void connectionLost (Throwable cause) { 
       System.out.println ("The Connection was lost."); 
      } 

      @Override 
      public void messageArrived (String topic, final MqttMessage message) throws Exception { 
       System.out.println ("Message received and Arrived"); 
      } 

      @Override 
      public void deliveryComplete (IMqttDeliveryToken token) { 
       System.out.println("Message Delivered"); 
      } 
     }); 

     final MqttConnectOptions mqttConnectOptions = new MqttConnectOptions(); 
     mqttConnectOptions.setMqttVersion (MqttConnectOptions.MQTT_VERSION_3_1_1); 
     mqttConnectOptions.setAutomaticReconnect (true); 
     mqttConnectOptions.setCleanSession (false); 

     try { 
      mqttAndroidClient.connect (mqttConnectOptions, null, new IMqttActionListener() { 

       @Override 
       public void onSuccess (IMqttToken asyncActionToken) { 
        System.out.println ("BROKER CONNECTED"); 

        DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions(); 
        disconnectedBufferOptions.setBufferEnabled (true); 
        disconnectedBufferOptions.setBufferSize (100); 
        disconnectedBufferOptions.setPersistBuffer (false); 
        disconnectedBufferOptions.setDeleteOldestMessages (false); 

        //mqttAndroidClient.setBufferOpts (disconnectedBufferOptions); 

       } 

       @Override 
       public void onFailure (IMqttToken asyncActionToken, Throwable exception) { 
        System.out.println ("Failed to connect to: " + serverUri); 
       } 
      }); 

     } catch (MqttException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    // ... 
} 

私はMQTTを新しくしました。もし誰かが助けてくれれば嬉しいです。事前

答えて

3

はあなたのようにそれを行う必要があります接続を複数回確立したくない場合ということを助けることができるかもしれないと思いますシングルトンには接続クラスのインスタンスが1つしかなく、1つの時間接続が確立されています。

だからあなたのコードでは、なります:

MainActivity.java:

public class MainActivity extends Activity { 

    protected void onCreate (Bundle savedInstanceState) { 
     super.onCreate (savedInstanceState); 
     setContentView (R.layout.chat_intera); 

     Connection connection = Connection.getInstance (getApplicationContext()); 
    } 

    // .... 
} 

Connection.java

public class Connection { 

    private  static Connection   connInst; 
    private  static boolean    connected; 

    private  static MqttAndroidClient mqttAndroidClient; 
    private  static IMqttActionListener mqttActionListener; 
    private final static MqttConnectOptions mqttConnectOptions = new MqttConnectOptions(); 
    static { 
     mqttConnectOptions.setMqttVersion (MqttConnectOptions.MQTT_VERSION_3_1_1); 
     mqttConnectOptions.setAutomaticReconnect (true); 
     mqttConnectOptions.setCleanSession (false); 
    } 

    private Connection (Context context) { 
     //Instantiate the mqtt android client class 
     mqttAndroidClient = new MqttAndroidClient (context.getApplicationContext(), serverUri, clientId); 

     mqttAndroidClient.setCallback (new MqttCallbackExtended() { 

      @Override 
      public void connectComplete (boolean reconnect, String serverURI) { 
       connected = true; 
       if (reconnect) { 
        System.out.println ("Reconnected to : " + serverURI); 
       } else { 
        System.out.println ("Connected to: " + serverURI); 
       } 
      } 

      @Override 
      public void connectionLost (Throwable cause) { 
       connected = false; 
       System.out.println ("The Connection was lost."); 
      } 

      @Override 
      public void messageArrived (String topic, final MqttMessage message) throws Exception { 
       System.out.println ("Message received and Arrived"); 
      } 

      @Override 
      public void deliveryComplete (IMqttDeliveryToken token) { 
       System.out.println("Message Delivered"); 
      } 
     }); 

     mqttActionListener = new IMqttActionListener() { 

      @Override 
      public void onSuccess (IMqttToken asyncActionToken) { 
       System.out.println ("BROKER CONNECTED"); 

       DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions(); 
       disconnectedBufferOptions.setBufferEnabled (true); 
       disconnectedBufferOptions.setBufferSize (100); 
       disconnectedBufferOptions.setPersistBuffer (false); 
       disconnectedBufferOptions.setDeleteOldestMessages (false); 

       //mqttAndroidClient.setBufferOpts (disconnectedBufferOptions); 

      } 

      @Override 
      public void onFailure (IMqttToken asyncActionToken, Throwable exception) { 
       System.out.println ("Failed to connect to: " + serverUri); 
      } 
     }); 
    } 

    public static Connection getInstance (Context context) { 
     if (connInst == null) { 
      connInst = new Connection (context); 
     } 
     createConnectionIfNeeded (context); 

     return connInst; 
    } 

    private static void createConnectionIfNeeded() { 
     if (connected) { 
      return; 
     } 

     try { 
      mqttAndroidClient.connect (mqttConnectOptions, null, mqttActionListener); 

     } catch (MqttException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    // ... 
} 
+0

複数の接続がまだ作成されています – George

+0

@George、それらが作成されたことをどのように知っていますか?コード全体を共有することができます。 (onResumeなど...) –

+0

上記の私の更新をチェックし、私が使用する方法である 'MainActivity Class'を更新しました – George

1

のおかげで、私はよく分からないが、私はnullのチェックはその後

if (connection == null){ 
    connections = new Connections(); 
    connections.createConnectionForPublishing(context); 
} 
+0

これは前と同じ結果を示しますが、動作しません – George

+0

MQTTクライアントはそのアクティビティでのみ必要ですか?多分、アクティビティのonPause voidで接続を閉じる必要があります。私がここに見るように http://www.eclipse.org/paho/files/android-javadoc/org/eclipse/paho/android/service/MqttAndroidClienthtml MqttAndroidClientオブジェクトのクローズボイドがあります。 –

0

私はあなたがAndroidのonPause()

を使用してフラグを設定することを示唆しています

https://developer.android.com/reference/android/app/Activity.html#onPause()

そして代わりにonCreate()を使用するのは、あなたのMQTT接続を開始するが、最初のonPause()フラグをチェックするonResume()を使用しています。

onPause()またはonDestroy()で接続を終了する必要がある場合もあります。詳細については、Androidアプリケーション/アクティビティのライフタイムをご覧ください。

関連する問題