From 805a03988e828ff574ab02e9b7d812b07b493156 Mon Sep 17 00:00:00 2001 From: Siva Velusamy Date: Wed, 21 Mar 2012 10:28:08 -0700 Subject: ADT launch: remove unnecessary creation of a new thread Always call continueLaunch() from a non UI thread. Currently, in one particular scenario, it is called from the UI thread which means that it has to do work inside a new thread. Change-Id: I40cafeb2bb047e1c6575ad5a626830e02d8d2e46 --- .../internal/launch/AndroidLaunchController.java | 73 +++++++++++----------- 1 file changed, 35 insertions(+), 38 deletions(-) diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AndroidLaunchController.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AndroidLaunchController.java index eb66cce..d7d87cb 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AndroidLaunchController.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AndroidLaunchController.java @@ -81,6 +81,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.concurrent.atomic.AtomicBoolean; /** * Controls the launch of Android application either on a device or on the @@ -572,7 +573,8 @@ public final class AndroidLaunchController implements IDebugBridgeChangeListener // bring up the device chooser. final IAndroidTarget desiredProjectTarget = projectTarget; - AdtPlugin.getDisplay().asyncExec(new Runnable() { + final AtomicBoolean continueLaunch = new AtomicBoolean(false); + AdtPlugin.getDisplay().syncExec(new Runnable() { @Override public void run() { try { @@ -584,8 +586,7 @@ public final class AndroidLaunchController implements IDebugBridgeChangeListener if (dialog.open() == Dialog.OK) { updateLaunchOnSameDeviceState(response, launch.getLaunchConfiguration().getName()); - AndroidLaunchController.this.continueLaunch(response, project, launch, - launchInfo, config); + continueLaunch.set(true); } else { AdtPlugin.printErrorToConsole(project, "Launch canceled!"); stopLaunch(launchInfo); @@ -606,6 +607,10 @@ public final class AndroidLaunchController implements IDebugBridgeChangeListener } } }); + + if (continueLaunch.get()) { + continueLaunch(response, project, launch, launchInfo, config); + } } private IDevice getDeviceUsedForLastLaunch(IDevice[] devices, @@ -671,45 +676,37 @@ public final class AndroidLaunchController implements IDebugBridgeChangeListener * @param launchInfo The {@link DelayedLaunchInfo} * @param config The config needed to start a new emulator. */ - void continueLaunch(final DeviceChooserResponse response, final IProject project, + private void continueLaunch(final DeviceChooserResponse response, final IProject project, final AndroidLaunch launch, final DelayedLaunchInfo launchInfo, final AndroidLaunchConfiguration config) { - - // Since this is called from the UI thread we spawn a new thread - // to finish the launch. - new Thread() { - @Override - public void run() { - if (response.getAvdToLaunch() != null) { - // there was no selected device, we start a new emulator. - synchronized (sListLock) { - AvdInfo info = response.getAvdToLaunch(); - mWaitingForEmulatorLaunches.add(launchInfo); - AdtPlugin.printToConsole(project, String.format( - "Launching a new emulator with Virtual Device '%1$s'", - info.getName())); - boolean status = launchEmulator(config, info); - - if (status == false) { - // launching the emulator failed! - AdtPlugin.displayError("Emulator Launch", - "Couldn't launch the emulator! Make sure the SDK directory is properly setup and the emulator is not missing."); - - // stop the launch and return - mWaitingForEmulatorLaunches.remove(launchInfo); - AdtPlugin.printErrorToConsole(project, "Launch canceled!"); - stopLaunch(launchInfo); - return; - } - - return; - } - } else if (response.getDeviceToUse() != null) { - launchInfo.setDevice(response.getDeviceToUse()); - simpleLaunch(launchInfo, launchInfo.getDevice()); + if (response.getAvdToLaunch() != null) { + // there was no selected device, we start a new emulator. + synchronized (sListLock) { + AvdInfo info = response.getAvdToLaunch(); + mWaitingForEmulatorLaunches.add(launchInfo); + AdtPlugin.printToConsole(project, String.format( + "Launching a new emulator with Virtual Device '%1$s'", + info.getName())); + boolean status = launchEmulator(config, info); + + if (status == false) { + // launching the emulator failed! + AdtPlugin.displayError("Emulator Launch", + "Couldn't launch the emulator! Make sure the SDK directory is properly setup and the emulator is not missing."); + + // stop the launch and return + mWaitingForEmulatorLaunches.remove(launchInfo); + AdtPlugin.printErrorToConsole(project, "Launch canceled!"); + stopLaunch(launchInfo); + return; } + + return; } - }.start(); + } else if (response.getDeviceToUse() != null) { + launchInfo.setDevice(response.getDeviceToUse()); + simpleLaunch(launchInfo, launchInfo.getDevice()); + } } /** -- cgit v1.1