Paho Android MQTTクライアントを使用してインスタントメッセージングシステムを作成しています。その実装は期待通りに機能しますが、私はこれらのエラーに直面しています。MQTTはonCreateが複数回呼び出されたときに複数の接続を作成します
MainActivity Class
のonCreate
にある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を新しくしました。もし誰かが助けてくれれば嬉しいです。事前
複数の接続がまだ作成されています – George
@George、それらが作成されたことをどのように知っていますか?コード全体を共有することができます。 (onResumeなど...) –
上記の私の更新をチェックし、私が使用する方法である 'MainActivity Class'を更新しました – George