|Enum Constant and Description|
Robolectric's threading model prior to 4.3.
A new mode that more accurately models real Android's
|Modifier and Type||Method and Description|
Returns the enum constant of this type with the specified name.
Returns an array containing the constants of this enum type, in the order they are declared.
clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
public static final LooperMode.Mode LEGACY
Schedulerbehavior can be controlled via
Scheduler.setIdleState(IdleState), with a default of
IdleState#UNPAUSED. There is only a single Looper thread - with tests and all posted Looper tasks executing on that thread.
ShadowLooperAPIs can also be used to control posted tasks, but most of those APIs just serve as a facade to
SchedulerAPIs. There are multiple problems with this mode. Some of the major ones are: 1. The default
IdleState#UNPAUSEDwill executed tasks posted to a
Looperinline synchronously. This differs from real Android behaviour, and can cause issues with code that expects/enforces that posted tasks execute in the correct order, such as RecyclerViews. 2. The
Schedulerlist of Runnables can get out of sync with the Looper's
MessageQueue, causing deadlocks or other race conditions. 3. Each
Schedulerkeeps its own time value, which can get out of sync. 4. Background
Loopertasks execute in the main thread, causing errors for code that enforces that it runs on a non-main
public static final LooperMode.Mode PAUSED
Looperbehavior, currently in Beta. Conceptually LooperMode.PAUSED is similar to the LEGACY
Scheduler.IdleState.PAUSEDin the following ways: - Tests run on the main looper thread - Tasks posted to the main
Looperare not executed automatically, and must be explicitly executed via
ShadowLooper.idle(). This guarantees execution order correctness -
SystemClocktime is frozen, and can be manually advanced via Robolectric APIs. However, it has the following improvements: - Robolectric will warn users if a test fails with unexecuted tasks in the main Looper queue - Robolectric test APIs, like
ActivityController.setup(), will automatically idle the main
Looperhas its own thread. Tasks posted to background loopers are executed asynchronously in separate threads. -
Looperuse the real
MessageQueueto store their queue of pending tasks - There is only a single clock value, managed via
ShadowSystemClock. This can be explictly incremented via
ShadowLooper.idleFor(Duration). A subset of the
SchedulerAPIs for the 'foreground' scheduler are currently supported in this mode as well, although it is recommended to switch to use ShadowLooper APIs directly. To use: - Apply the LooperMode(PAUSED) annotation to your test package/class/method - Convert any background
Loopers to shadowOf(looper) - Convert any
InlineExecutorService- Run your tests. If you see an test failures like 'Main looper has queued unexecuted runnables.', you may need to insert shadowOf(getMainLooper()).idle() calls to your test to drain the main Looper.
public static LooperMode.Mode values()
for (LooperMode.Mode c : LooperMode.Mode.values()) System.out.println(c);
public static LooperMode.Mode valueOf(String name)