Mon application de MainActivity onCreate(), démarre un service qui se connecte au serveur et s'abonne aux rubriques. De plus, lorsque j'ajoute une nouvelle connexion, mon service redémarre (en utilisant stop/startService). Je stocke les données de connexion (ip, port, etc.) dans la base de données SQL et le regroupe dans le service une fois qu'il démarre. Le problème est (je pense) que lorsque l'un des paramètres de connexion est incorrect le service attend le timeout et bloque une activité ... Si je règle token.waitForCompletion(500);
ça va beaucoup plus vite mais je ne peux pas deviner cette valeur ...Pourquoi le service MQTT bloque-t-il l'activité?
Y at-il moyen de résoudre mon problème?
@Override
public void onCreate() {
Datapool();
IntentFilter intentf = new IntentFilter();
intentf.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mqttBroadcastReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
mConnMan = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
deviceId = String.format(DEVICE_ID_FORMAT, Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID));
}
MQTTBroadcastReceiver mqttBroadcastReceiver = new MQTTBroadcastReceiver();
class MQTTBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Connect();
}
};
IMqttToken token;
int i = 0;
private HashMap<String, Boolean> _hashMap = new HashMap<>();
private void Connect(){
for (ServiceDataModel connectionData : dataModels) {
Log.d(TAG, "doConnect() " + connectionData.getCONNECTION_NAME());
_hashMap.put(connectionData.getCONNECTION_NAME(), false);
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true);
i++;
try {
mqttClient = new MqttAsyncClient("tcp://" + connectionData.getSERVER_IP() + ":" + connectionData.getSERVER_PORT(), deviceId + i , new MemoryPersistence());
token = mqttClient.connect();
token.waitForCompletion(2500);
if (mqttClient.isConnected()) {
mqttClient.setCallback(new MqttEventCallback());
token = mqttClient.subscribe(connectionData.getTOPIC(), Integer.parseInt(connectionData.getQOS()));
token.waitForCompletion(2500);
_hashMap.put(connectionData.getCONNECTION_NAME(), true);
}
}catch (Exception ex){
Log.d(TAG, ex.toString() + connectionData.toString());
}
}
sendMessageToActivity(_hashMap);
}