diff options
author | Raphael Moll <ralf@android.com> | 2012-09-11 19:38:46 -0700 |
---|---|---|
committer | Raphael Moll <ralf@android.com> | 2012-09-11 21:33:52 -0700 |
commit | 3430f2813e3eab87786079de2f82e566d07c056e (patch) | |
tree | 9cb055b26ee078d51efac48f72023ddc9279e6df /sdkmanager | |
parent | 82256a9db0e605d01d5d31477e4f20185ab66c78 (diff) | |
download | sdk-3430f2813e3eab87786079de2f82e566d07c056e.zip sdk-3430f2813e3eab87786079de2f82e566d07c056e.tar.gz sdk-3430f2813e3eab87786079de2f82e566d07c056e.tar.bz2 |
Properly dispose DeviceManager from AvdManager.
Similar issue fixed by patch d1daeae66a0ebdf53076038dc4a1fe099c4141fb
but this time for the AvdManager.
Change-Id: I10af39d364e427d593078f8bfa23bba3ba7e1558
Diffstat (limited to 'sdkmanager')
-rw-r--r-- | sdkmanager/libs/sdklib/src/com/android/sdklib/devices/DeviceManager.java | 63 | ||||
-rwxr-xr-x | sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AvdManagerPage.java | 10 |
2 files changed, 46 insertions, 27 deletions
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/devices/DeviceManager.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/devices/DeviceManager.java index 27feb00..d5297d3 100644 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/devices/DeviceManager.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/devices/DeviceManager.java @@ -68,8 +68,8 @@ public class DeviceManager { private static List<Device> mUserDevices; private static List<Device> mDefaultDevices; private static final Object sLock = new Object(); - private static final List<DevicesChangeListener> listeners = - Collections.synchronizedList(new ArrayList<DevicesChangeListener>()); + private static final List<DevicesChangeListener> sListeners = + new ArrayList<DevicesChangeListener>(); public static enum DeviceStatus { /** @@ -87,10 +87,8 @@ public class DeviceManager { } // TODO: Refactor this to look more like AvdManager so that we don't have - // multiple instances - // in the same application, which forces us to parse the XML multiple times - // when we don't - // to. + // multiple instances in the same application, which forces us to parse + // the XML multiple times when we don't have to. public DeviceManager(ILogger log) { mLog = log; } @@ -108,19 +106,29 @@ public class DeviceManager { /** * Register a listener to be notified when the device lists are modified. - * @param listener The listener to add + * + * @param listener The listener to add. Ignored if already registered. */ public void registerListener(DevicesChangeListener listener) { - listeners.add(listener); + if (listener != null) { + synchronized (sListeners) { + if (!sListeners.contains(listener)) { + sListeners.add(listener); + } + } + } } /** * Removes a listener from the notification list such that it will no longer receive * notifications when modifications to the {@link Device} list occur. + * * @param listener The listener to remove. */ public boolean unregisterListener(DevicesChangeListener listener) { - return listeners.remove(listener); + synchronized (sListeners) { + return sListeners.remove(listener); + } } public DeviceStatus getDeviceStatus( @@ -189,10 +197,10 @@ public class DeviceManager { } /** - * Returns all vendor provided {@link Device}s + * Returns all vendor-provided {@link Device}s * * @param sdkLocation Location of the Android SDK - * @return A list of vendor provided {@link Device}s + * @return A list of vendor-provided {@link Device}s */ public List<Device> getVendorDevices(String sdkLocation) { synchronized (sLock) { @@ -224,9 +232,9 @@ public class DeviceManager { } /** - * Returns all user created {@link Device}s + * Returns all user-created {@link Device}s * - * @return All user created {@link Device}s + * @return All user-created {@link Device}s */ public List<Device> getUserDevices() { synchronized (sLock) { @@ -244,22 +252,25 @@ public class DeviceManager { mLog.warning("Couldn't load user devices: %1$s", e.getMessage()); } catch (SAXException e) { // Probably an old config file which we don't want to overwrite. - // FIXME: userDevicesFile is likely null at this point and below. - String base = userDevicesFile.getAbsoluteFile()+".old"; - File renamedConfig = new File(base); - int i = 0; - while (renamedConfig.exists()) { - renamedConfig = new File(base + "." + (i++)); + if (userDevicesFile != null) { + String base = userDevicesFile.getAbsoluteFile() + ".old"; + File renamedConfig = new File(base); + int i = 0; + while (renamedConfig.exists()) { + renamedConfig = new File(base + '.' + (i++)); + } + mLog.error(null, "Error parsing %1$s, backing up to %2$s", + userDevicesFile.getAbsolutePath(), renamedConfig.getAbsolutePath()); + userDevicesFile.renameTo(renamedConfig); } - mLog.error(null, "Error parsing %1$s, backing up to %2$s", - userDevicesFile.getAbsolutePath(), renamedConfig.getAbsolutePath()); - userDevicesFile.renameTo(renamedConfig); } catch (FileNotFoundException e) { mLog.warning("No user devices found"); } catch (ParserConfigurationException e) { - mLog.error(null, "Error parsing %1$s", userDevicesFile.getAbsolutePath()); + mLog.error(null, "Error parsing %1$s", + userDevicesFile == null ? "(null)" : userDevicesFile.getAbsolutePath()); } catch (IOException e) { - mLog.error(null, "Error parsing %1$s", userDevicesFile.getAbsolutePath()); + mLog.error(null, "Error parsing %1$s", + userDevicesFile == null ? "(null)" : userDevicesFile.getAbsolutePath()); } } } @@ -421,8 +432,8 @@ public class DeviceManager { } private void notifyListeners() { - synchronized (listeners) { - for (DevicesChangeListener listener : listeners) { + synchronized (sListeners) { + for (DevicesChangeListener listener : sListeners) { listener.onDevicesChange(); } } diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AvdManagerPage.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AvdManagerPage.java index c691b77..1074dfa 100755 --- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AvdManagerPage.java +++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AvdManagerPage.java @@ -25,6 +25,8 @@ import com.android.sdkuilib.internal.widgets.AvdSelector.DisplayMode; import com.android.sdkuilib.repository.ISdkChangeListener; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; @@ -39,7 +41,8 @@ import org.eclipse.swt.widgets.Label; * thus composed of the {@link AvdManagerWindowImpl1} (the window shell itself) and this * page displays the actually list of AVDs and various action buttons. */ -public class AvdManagerPage extends Composite implements ISdkChangeListener, DevicesChangeListener { +public class AvdManagerPage extends Composite + implements ISdkChangeListener, DevicesChangeListener, DisposeListener { private AvdSelector mAvdSelector; @@ -93,6 +96,11 @@ public class AvdManagerPage extends Composite implements ISdkChangeListener, Dev } @Override + public void widgetDisposed(DisposeEvent e) { + dispose(); + } + + @Override public void dispose() { mUpdaterData.removeListener(this); mDeviceManager.unregisterListener(this); |