Package org.robolectric.shadows
Class ShadowLooper
java.lang.Object
org.robolectric.shadows.ShadowLooper
- Direct Known Subclasses:
ShadowLegacyLooper
,ShadowPausedLooper
@Implements(value=android.os.Looper.class,
shadowPicker=Picker.class)
public abstract class ShadowLooper
extends Object
The base shadow API class for controlling Loopers.
It will delegate calls to the appropriate shadow based on the current LooperMode.
-
Nested Class Summary
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionstatic void
assertLooperMode
(LooperMode.Mode expectedMode) static void
static Collection<Looper>
Return all created loopers.abstract Duration
static Looper
getLooperForThread
(Thread thread) abstract Duration
abstract Scheduler
Returns theScheduler
that is being used to manage the enqueued tasks.static ShadowLooper
Deprecated.abstract boolean
hasQuit()
abstract void
idle()
Executes all posted tasks scheduled before or at the current time.final void
idle
(long intervalMillis) Deprecated.UseidleFor(Duration)
.final void
Deprecated.abstract void
idleConstantly
(boolean shouldIdleConstantly) abstract void
Advances the system clock by the given time, then executes all posted tasks scheduled before or at the given time.void
A variant ofidleFor(long, TimeUnit)
that accepts a Duration.abstract void
Helper method to selectively call idle() only if LooperMode is PAUSED.static void
static void
idleMainLooper
(long interval) Deprecated.static void
idleMainLooper
(long amount, TimeUnit unit) static void
idleMainLooperConstantly
(boolean shouldIdleConstantly) abstract boolean
isIdle()
Returns true if there are no pending tasks scheduled to be executed before current time.abstract boolean
isPaused()
static LooperMode.Mode
Return the currentLooperMode
.abstract void
pause()
Pause the looper.static void
pauseLooper
(Looper looper) Pauses execution of tasks posted to the ShadowLegacyLooper.static void
Puts the main ShadowLegacyLooper in an "paused" state.abstract boolean
Deprecated.Use aHandler
instance to post to a looper.abstract boolean
postAtFrontOfQueue
(Runnable runnable) Deprecated.Use aHandler
instance to post to a looper.abstract void
abstract void
reset()
Causes all enqueued tasks to be discarded, and pause state to be resetabstract void
Only supported forLooperMode.Mode.LEGACY
.static void
Should not be called directly - Robolectric internal use only.static void
static void
abstract void
Causes only one of the nextRunnable
s that have been scheduled to run while advancing the clock to its start time.abstract void
Runs the current task with the looper paused.abstract void
abstract void
Causes the nextRunnable
(s) that have been scheduled to run while advancing the clock to its start time.static void
Runs any immediately runnable tasks previously queued on the UI thread, e.g.static void
Runs all runnable tasks (pending and future) that have been queued on the UI thread.abstract boolean
setPaused
(boolean shouldPause) Control the paused state of the Looper.static ShadowLooper
abstract void
unPause()
Not supported for the main Looper inLooperMode.Mode.PAUSED
.static void
unPauseLooper
(Looper looper) Puts the shadow looper in an "unpaused" state (this is the default state).static void
Puts the main ShadowLegacyLooper in an "unpaused" state.
-
Constructor Details
-
ShadowLooper
public ShadowLooper()
-
-
Method Details
-
assertLooperMode
-
getShadowMainLooper
Deprecated.UseshadowOf({@link Looper#getMainLooper()})
instead. -
shadowMainLooper
-
getLooperForThread
-
getAllLoopers
Return all created loopers. -
resetThreadLoopers
public static void resetThreadLoopers()Should not be called directly - Robolectric internal use only. -
looperMode
Return the currentLooperMode
. -
clearLooperMode
-
pauseLooper
Pauses execution of tasks posted to the ShadowLegacyLooper. This means that during tests, tasks sent to the looper will not execute immediately, but will be queued in a way that is similar to how a real looper works. These queued tasks must be executed explicitly by calling#runToEndOftasks
or a similar method, otherwise they will not run at all before your test ends.- Parameters:
looper
- the looper to pause
-
unPauseLooper
Puts the shadow looper in an "unpaused" state (this is the default state). This means that during tests, tasks sent to the looper will execute inline, immediately, on the calling (main) thread instead of being queued, in a way similar to how Guava's "DirectExecutorService" works. This is likely not to be what you want: it will cause code to be potentially executed in a different order than how it would execute on the device, and if you are using certain Android APIs (such as view animations) that are non-reentrant, they may not work at all or do unpredictable things. For more information, see this discussion.- Parameters:
looper
- the looper to pause
-
pauseMainLooper
public static void pauseMainLooper()Puts the main ShadowLegacyLooper in an "paused" state.- See Also:
-
unPauseMainLooper
public static void unPauseMainLooper()Puts the main ShadowLegacyLooper in an "unpaused" state.- See Also:
-
idleMainLooper
public static void idleMainLooper() -
idleMainLooper
@InlineMe(replacement="ShadowLooper.idleMainLooper(interval, MILLISECONDS)", imports="org.robolectric.shadows.ShadowLooper", staticImports="java.util.concurrent.TimeUnit.MILLISECONDS") @Deprecated public static void idleMainLooper(long interval) Deprecated. -
idleMainLooper
-
idleMainLooperConstantly
public static void idleMainLooperConstantly(boolean shouldIdleConstantly) -
runMainLooperOneTask
public static void runMainLooperOneTask() -
runMainLooperToNextTask
public static void runMainLooperToNextTask() -
runUiThreadTasks
public static void runUiThreadTasks()Runs any immediately runnable tasks previously queued on the UI thread, e.g. byActivity.runOnUiThread(Runnable)
orAsyncTask.onPostExecute(Object)
.**Note:** calling this method does not pause or un-pause the scheduler.
- See Also:
-
runUiThreadTasksIncludingDelayedTasks
public static void runUiThreadTasksIncludingDelayedTasks()Runs all runnable tasks (pending and future) that have been queued on the UI thread. Such tasks may be queued by e.g.Activity.runOnUiThread(Runnable)
orAsyncTask.onPostExecute(Object)
.**Note:** calling this method does not pause or un-pause the scheduler, however the clock is advanced as future tasks are run.
- See Also:
-
quitUnchecked
public abstract void quitUnchecked() -
hasQuit
public abstract boolean hasQuit() -
idle
public abstract void idle()Executes all posted tasks scheduled before or at the current time. -
idleFor
Advances the system clock by the given time, then executes all posted tasks scheduled before or at the given time. -
idleFor
A variant ofidleFor(long, TimeUnit)
that accepts a Duration. -
isIdle
public abstract boolean isIdle()Returns true if there are no pending tasks scheduled to be executed before current time. -
unPause
public abstract void unPause()Not supported for the main Looper inLooperMode.Mode.PAUSED
. -
isPaused
public abstract boolean isPaused() -
setPaused
public abstract boolean setPaused(boolean shouldPause) Control the paused state of the Looper.Not supported for the main Looper in
LooperMode.Mode.PAUSED
. -
resetScheduler
public abstract void resetScheduler()Only supported forLooperMode.Mode.LEGACY
. -
reset
public abstract void reset()Causes all enqueued tasks to be discarded, and pause state to be reset -
getScheduler
Returns theScheduler
that is being used to manage the enqueued tasks. This scheduler is managed by the Looper's associated queue.Only supported for
LooperMode.Mode.LEGACY
.- Returns:
- the
Scheduler
that is being used to manage the enqueued tasks.
-
runPaused
Runs the current task with the looper paused.When LooperMode is PAUSED, this will execute all pending tasks scheduled before the current time.
-
idleIfPaused
public abstract void idleIfPaused()Helper method to selectively call idle() only if LooperMode is PAUSED.Intended for backwards compatibility, to avoid changing behavior for tests still using LEGACY LooperMode.
-
idle
@Deprecated @InlineMe(replacement="this.idleFor(Duration.ofMillis(intervalMillis))", imports="java.time.Duration") public final void idle(long intervalMillis) Deprecated.UseidleFor(Duration)
.CausesRunnable
s that have been scheduled to run within the nextintervalMillis
milliseconds to run while advancing the scheduler's clock. -
idle
@Deprecated @InlineMe(replacement="this.idleFor(amount, unit)") public final void idle(long amount, TimeUnit unit) Deprecated.CausesRunnable
s that have been scheduled to run within the next specified amount of time to run while advancing the clock. -
idleConstantly
public abstract void idleConstantly(boolean shouldIdleConstantly) -
runToEndOfTasks
public abstract void runToEndOfTasks() -
runToNextTask
public abstract void runToNextTask() -
runOneTask
public abstract void runOneTask() -
post
Deprecated.Use aHandler
instance to post to a looper.Enqueue a task to be run later.- Parameters:
runnable
- the task to be rundelayMillis
- how many milliseconds into the (virtual) future to run it- Returns:
- true if the runnable is enqueued
- See Also:
-
postAtFrontOfQueue
Deprecated.Use aHandler
instance to post to a looper.Enqueue a task to be run ahead of all other delayed tasks.- Parameters:
runnable
- the task to be run- Returns:
- true if the runnable is enqueued
- See Also:
-
pause
public abstract void pause()Pause the looper.Has no practical effect for realistic looper, since it is always paused.
-
getNextScheduledTaskTime
- Returns:
- the scheduled time of the next posted task; Duration.ZERO if there is no currently scheduled task.
-
getLastScheduledTaskTime
- Returns:
- the scheduled time of the last posted task; Duration.ZERO 0 if there is no currently scheduled task.
-
shadowOf({@link Looper#getMainLooper()})
instead.