diff --git a/robotium-solo/src/main/java/com/robotium/solo/ActivityUtils.java b/robotium-solo/src/main/java/com/robotium/solo/ActivityUtils.java index 19bb25cc..37dde140 100644 --- a/robotium-solo/src/main/java/com/robotium/solo/ActivityUtils.java +++ b/robotium-solo/src/main/java/com/robotium/solo/ActivityUtils.java @@ -11,10 +11,10 @@ import android.app.Instrumentation; import android.app.Instrumentation.ActivityMonitor; import android.content.IntentFilter; +import android.os.SystemClock; import android.util.Log; import android.view.KeyEvent; - /** * Contains activity related methods. Examples are: * getCurrentActivity(), getActivityMonitor(), setActivityOrientation(int orientation). @@ -145,28 +145,28 @@ private void setupActivityStackListener() { setRegisterActivities(true); - Runnable runnable = new Runnable() { - public void run() { - while (shouldRegisterActivities()) { - if(activityMonitor != null){ - Activity activity = activityMonitor.waitForActivityWithTimeout(2000); - - if(activity != null){ - if (activitiesStoredInActivityStack.remove(activity.toString())){ - removeActivityFromStack(activity); - } - if(!activity.isFinishing()){ - addActivityToStack(activity); - } - } - } + activityThread = new RegisterActivitiesThread(this); + activityThread.start(); + } + + + void monitorActivities() { + if(activityMonitor != null){ + Activity activity = activityMonitor.waitForActivityWithTimeout(2000L); + + if(activity != null){ + if (activitiesStoredInActivityStack.remove(activity.toString())){ + removeActivityFromStack(activity); + } + if(!activity.isFinishing()){ + addActivityToStack(activity); } } - }; - activityThread = new Thread(runnable, "activityMonitorThread"); - activityThread.start(); + } } + + /** * Removes a given activity from the activity stack * @@ -464,4 +464,38 @@ private void finishActivity(Activity activity){ } } } + + private static final class RegisterActivitiesThread extends Thread { + + public static final long REGISTER_ACTIVITY_THREAD_SLEEP_MS = 16L; + private final WeakReference activityUtilsWR; + + RegisterActivitiesThread(ActivityUtils activityUtils) { + super("activityMonitorThread"); + activityUtilsWR = new WeakReference(activityUtils); + setPriority(Thread.MIN_PRIORITY); + } + + @Override + public void run() { + while (shouldMonitor()) { + monitorActivities(); + SystemClock.sleep(REGISTER_ACTIVITY_THREAD_SLEEP_MS); + } + } + + private boolean shouldMonitor() { + ActivityUtils activityUtils = activityUtilsWR.get(); + + return activityUtils != null && activityUtils.shouldRegisterActivities(); + } + + private void monitorActivities() { + ActivityUtils activityUtils = activityUtilsWR.get(); + if (activityUtils != null) { + activityUtils.monitorActivities(); + } + } + } + }