avoid unnecessary thread creation

iNPUTmice created

Change summary

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java | 37 
src/main/java/eu/siacs/conversations/ui/SettingsActivity.java            |  2 
src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java            |  7 
3 files changed, 29 insertions(+), 17 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -1136,7 +1136,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 		account.initOtrEngine(this);
 		databaseBackend.createAccount(account);
 		this.accounts.add(account);
-		this.reconnectAccount(account, false);
+		this.reconnectAccountInBackground(account);
 		updateAccountUi();
 	}
 
@@ -1972,24 +1972,29 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 	}
 
 	public void reconnectAccount(final Account account, final boolean force) {
-		new Thread(new Runnable() {
+		synchronized (account) {
+			if (account.getXmppConnection() != null) {
+				disconnect(account, force);
+			}
+			if (!account.isOptionSet(Account.OPTION_DISABLED)) {
+				if (account.getXmppConnection() == null) {
+					account.setXmppConnection(createConnection(account));
+				}
+				Thread thread = new Thread(account.getXmppConnection());
+				thread.start();
+				scheduleWakeUpCall(Config.CONNECT_TIMEOUT, account.getUuid().hashCode());
+			} else {
+				account.getRoster().clearPresences();
+				account.setXmppConnection(null);
+			}
+		}
+	}
 
+	public void reconnectAccountInBackground(final Account account) {
+		new Thread(new Runnable() {
 			@Override
 			public void run() {
-				if (account.getXmppConnection() != null) {
-					disconnect(account, force);
-				}
-				if (!account.isOptionSet(Account.OPTION_DISABLED)) {
-					if (account.getXmppConnection() == null) {
-						account.setXmppConnection(createConnection(account));
-					}
-					Thread thread = new Thread(account.getXmppConnection());
-					thread.start();
-					scheduleWakeUpCall(Config.CONNECT_TIMEOUT, account.getUuid().hashCode());
-				} else {
-					account.getRoster().clearPresences();
-					account.setXmppConnection(null);
-				}
+				reconnectAccount(account,false);
 			}
 		}).start();
 	}

src/main/java/eu/siacs/conversations/ui/SettingsActivity.java 🔗

@@ -65,7 +65,7 @@ public class SettingsActivity extends XmppActivity implements
 				for (Account account : xmppConnectionService.getAccounts()) {
                     account.setResource(resource);
                     if (!account.isOptionSet(Account.OPTION_DISABLED)) {
-						xmppConnectionService.reconnectAccount(account, false);
+						xmppConnectionService.reconnectAccountInBackground(account);
 					}
 				}
 			}