aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xsdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressView.java12
-rwxr-xr-xsdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/TaskMonitorImpl.java8
2 files changed, 19 insertions, 1 deletions
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressView.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressView.java
index efa1a93..d90eaed 100755
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressView.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressView.java
@@ -148,7 +148,17 @@ public final class ProgressView implements IProgressUiProvider {
final Thread t = new Thread(r, title);
t.start();
- if (parentMonitor == null && !mProgressBar.isDisposed()) {
+ // If for some reason the UI has been disposed, just abort the thread.
+ if (mProgressBar.isDisposed()) {
+ return;
+ }
+
+ if (TaskMonitorImpl.isTaskMonitorImpl(parentMonitor)) {
+ // If there's a parent monitor and it's our own class, we know this parent
+ // monitor is already running an event loop, so don't run a second one,
+ // and instead just wait for the thread.
+ t.join();
+ } else {
// Process the app's event loop whilst we wait for the thread to finish
while (!mProgressBar.isDisposed() && t.isAlive()) {
if (!mProgressBar.getDisplay().readAndDispatch()) {
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/TaskMonitorImpl.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/TaskMonitorImpl.java
index 547bc37..5286df5 100755
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/TaskMonitorImpl.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/TaskMonitorImpl.java
@@ -38,6 +38,14 @@ class TaskMonitorImpl implements ITaskMonitor {
private final IProgressUiProvider mUi;
/**
+ * Returns true if the given {@code monitor} is an instance of {@link TaskMonitorImpl}
+ * or its private SubTaskMonitor.
+ */
+ public static boolean isTaskMonitorImpl(ITaskMonitor monitor) {
+ return monitor instanceof TaskMonitorImpl || monitor instanceof SubTaskMonitor;
+ }
+
+ /**
* Constructs a new {@link TaskMonitorImpl} that relies on the given
* {@link IProgressUiProvider} to change the user interface.
* @param ui The {@link IProgressUiProvider}. Cannot be null.