MainActivity onCreate()のアプリケーションは、サーバーに接続しトピックを購読するサービスを開始します。また、新しい接続を追加すると、サービスが(stop/startServiceを使用して)再起動します。私はSQLデータベースに接続データ(ip、portなど)を保存し、起動後にサービスにプールします。問題は(私は)接続パラメータの1つが間違っていると、サービスがタイムアウトを待っていて、アクティビティをブロックしているということです... token.waitForCompletion(500);
を設定すると、はるかに速くなりますが、その値を推測することはできません...MQTTサービスがなぜ活動をブロックしていますか?
私の問題を解決する方法はありますか?
@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);
}