Observer subscribes to it, replays
those events to it until the Observer catches up and then switches to relaying events live to
this single Observer until this UnicastSubject terminates or the Observer unsubscribes.
Note that UnicastSubject holds an unbounded internal buffer.
This subject does not have a public constructor by design; a new empty instance of this
UnicastSubject can be created via the following create methods that
allow specifying the retention policy for items:
create() - creates an empty, unbounded UnicastSubject that
caches all items and the terminal event it receives.create(int) - creates an empty, unbounded UnicastSubject
with a hint about how many total items one expects to retain.create(boolean) - creates an empty, unbounded UnicastSubject that
optionally delays an error it receives and replays it after the regular items have been emitted.create(int, Runnable) - creates an empty, unbounded UnicastSubject
with a hint about how many total items one expects to retain and a callback that will be
called exactly once when the UnicastSubject gets terminated or the single Observer unsubscribes.create(int, Runnable, boolean) - creates an empty, unbounded UnicastSubject
with a hint about how many total items one expects to retain and a callback that will be
called exactly once when the UnicastSubject gets terminated or the single Observer unsubscribes
and optionally delays an error it receives and replays it after the regular items have been emitted.
If more than one Observer attempts to subscribe to this UnicastSubject, they
will receive an IllegalStateException indicating the single-use-only nature of this UnicastSubject,
even if the UnicastSubject already terminated with an error.
Since a Subject is conceptionally derived from the Processor type in the Reactive Streams specification,
nulls are not allowed (Rule 2.13) as
parameters to onNext(Object) and onError(Throwable). Such calls will result in a
NullPointerException being thrown and the subject's state is not changed.
Since a UnicastSubject is an io., it does not support backpressure.
When this UnicastSubject is terminated via onError(Throwable) the current or late single Observer
may receive the Throwable before any available items could be emitted. To make sure an onError event is delivered
to the Observer after the normal items, create a UnicastSubject with the create(boolean) or
create(int, Runnable, boolean) factory methods.
Even though UnicastSubject implements the Observer interface, calling
onSubscribe is not required (Rule 2.12)
if the subject is used as a standalone source. However, calling onSubscribe
after the UnicastSubject reached its terminal state will result in the
given Disposable being disposed immediately.
Calling onNext(Object), onError(Throwable) and onComplete()
is required to be serialized (called from the same thread or called non-overlappingly from different threads
through external means of serialization). The toSerialized() method available to all Subjects
provides such serialization and also protects against reentrance (i.e., when a downstream Observer
consuming this subject also wants to call onNext(Object) on this subject recursively).
This UnicastSubject supports the standard state-peeking methods hasComplete(), hasThrowable(),
getThrowable() and hasObservers().
UnicastSubject does not operate by default on a particular io.reactivex.Scheduler and
the single Observer gets notified on the thread the respective onXXX methods were invoked.onError(Throwable) is called, the UnicastSubject enters into a terminal state
and emits the same Throwable instance to the current single Observer. During this emission,
if the single Observers disposes its respective Disposable, the
Throwable is delivered to the global error handler via
io.reactivex.plugins.RxJavaPlugins#onError(Throwable) .
If there were no Observers subscribed to this UnicastSubject when the onError()
was called, the global error handler is not invoked.
Example usage:
UnicastSubject<Integer> subject = UnicastSubject.create();
TestObserver<Integer> to1 = subject.test();
// fresh UnicastSubjects are empty
to1.assertEmpty();
TestObserver<Integer> to2 = subject.test();
// A UnicastSubject only allows one Observer during its lifetime
to2.assertFailure(IllegalStateException.class);
subject.onNext(1);
to1.assertValue(1);
subject.onNext(2);
to1.assertValues(1, 2);
subject.onComplete();
to1.assertResult(1, 2);
// ----------------------------------------------------
UnicastSubject<Integer> subject2 = UnicastSubject.create();
// a UnicastSubject caches events until its single Observer subscribes
subject2.onNext(1);
subject2.onNext(2);
subject2.onComplete();
TestObserver<Integer> to3 = subject2.test();
// the cached events are emitted in order
to3.assertResult(1, 2);
| Modifier and Type | Class and Description |
|---|---|
| pack-priv class |
| Modifier and Type | Field and Description |
|---|---|
| pack-priv final boolean | delayError
deliver onNext events before error event. |
| pack-priv volatile boolean | disposed
Indicates the single observer has cancelled. |
| pack-priv volatile boolean | done
Indicates the source has terminated. |
| pack-priv final AtomicReference | downstream
The single Observer. |
| pack-priv boolean | |
| pack-priv Throwable | error
The terminal error if not null. |
| pack-priv final AtomicBoolean | once
Set to 1 atomically for the first and only Subscriber. |
| pack-priv final AtomicReference | onTerminate
The optional callback when the Subject gets cancelled or terminates. |
| pack-priv final SpscLinkedArrayQueue | queue
The queue that buffers the source events. |
| pack-priv final BasicIntQueueDisposable | wip
The wip counter and QueueDisposable surface. |
| Access | Constructor and Description |
|---|---|
| pack-priv | UnicastSubject(int
the capacity hint for the internal, unbounded queue capacityHint, boolean deliver pending onNext events before onError delayError)Creates an UnicastSubject with the given capacity hint and delay error flag. |
| pack-priv | UnicastSubject(int
the capacity hint for the internal, unbounded queue capacityHint, Runnable the callback to run when the Subject is terminated or cancelled, null not allowed onTerminate)Creates an UnicastSubject with the given capacity hint and callback for when the Subject is terminated normally or its single Subscriber cancels. |
| pack-priv | UnicastSubject(int
the capacity hint for the internal, unbounded queue capacityHint, Runnable the callback to run when the Subject is terminated or cancelled, null not allowed onTerminate, boolean deliver pending onNext events before onError delayError)Creates an UnicastSubject with the given capacity hint, delay error flag and callback for when the Subject is terminated normally or its single Subscriber cancels. |
| Modifier and Type | Method and Description |
|---|---|
| public static < the value type T> UnicastSubject | Returns: an UnicastSubject instanceCreates an UnicastSubject with an internal buffer capacity hint 16. |
| public static < the value type T> UnicastSubject | Returns: an UnicastSubject instancethe hint to size the internal unbounded buffer capacityHint)Creates an UnicastSubject with the given internal buffer capacity hint. |
| public static < the value type T> UnicastSubject | Returns: an UnicastSubject instancethe hint to size the internal unbounded buffer capacityHint, Runnable the callback to run when the Subject is terminated or cancelled, null not allowed onTerminate)Creates an UnicastSubject with the given internal buffer capacity hint and a callback for the case when the single Subscriber cancels its subscription. |
| public static < the value type T> UnicastSubject | Returns: an UnicastSubject instancethe hint to size the internal unbounded buffer capacityHint, Runnable the callback to run when the Subject is terminated or cancelled, null not allowed onTerminate, boolean deliver pending onNext events before onError delayError)Creates an UnicastSubject with the given internal buffer capacity hint, delay error flag and a callback for the case when the single Subscriber cancels its subscription. |
| public static < the value type T> UnicastSubject | Returns: an UnicastSubject instancedeliver pending onNext events before onError delayError)Creates an UnicastSubject with an internal buffer capacity hint 16 and given delay error flag. |
| pack-priv void | |
| pack-priv void | |
| pack-priv void | |
| pack-priv void | |
| pack-priv void | |
| pack-priv boolean | |
| public Throwable | getThrowable()
Implements abstract io. |
| public boolean | hasComplete()
Implements abstract io. |
| public boolean | hasObservers()
Implements abstract io. |
| public boolean | hasThrowable()
Implements abstract io. |
| public void | onComplete()
Implements io. Observable has finished sending push-based notifications.
|
| public void | onError(Throwable
the exception encountered by the Observable t)Implements io. Observable has experienced an error condition.
|
| public void | onNext(T
the item emitted by the Observable t)Implements io. |
| public void | onSubscribe(Disposable
the Disposable instance whose d)Disposable#dispose() can
be called anytime to cancel the connectionImplements io. onNext(Object)) and asynchronous manner.
|
| protected void | subscribeActual(Observer<? super T>
the incoming Observer, never null observer)Implements abstract io. Observers.
|
| delayError | back to summary |
|---|---|
| pack-priv final boolean delayError deliver onNext events before error event. | |
| disposed | back to summary |
|---|---|
| pack-priv volatile boolean disposed Indicates the single observer has cancelled. | |
| done | back to summary |
|---|---|
| pack-priv volatile boolean done Indicates the source has terminated. | |
| downstream | back to summary |
|---|---|
| pack-priv final AtomicReference<Observer<? super T>> downstream The single Observer. | |
| enableOperatorFusion | back to summary |
|---|---|
| pack-priv boolean enableOperatorFusion | |
| error | back to summary |
|---|---|
| pack-priv Throwable error The terminal error if not null. Must be set before writing to done and read after done == true. | |
| once | back to summary |
|---|---|
| pack-priv final AtomicBoolean once Set to 1 atomically for the first and only Subscriber. | |
| onTerminate | back to summary |
|---|---|
| pack-priv final AtomicReference<Runnable> onTerminate The optional callback when the Subject gets cancelled or terminates. | |
| queue | back to summary |
|---|---|
| pack-priv final SpscLinkedArrayQueue<T> queue The queue that buffers the source events. | |
| wip | back to summary |
|---|---|
| pack-priv final BasicIntQueueDisposable<T> wip The wip counter and QueueDisposable surface. | |
| UnicastSubject | back to summary |
|---|---|
| pack-priv UnicastSubject(int capacityHint, boolean delayError) Creates an UnicastSubject with the given capacity hint and delay error flag. History: 2.0.8 - experimental
| |
| UnicastSubject | back to summary |
|---|---|
| pack-priv UnicastSubject(int capacityHint, Runnable onTerminate) Creates an UnicastSubject with the given capacity hint and callback for when the Subject is terminated normally or its single Subscriber cancels.
| |
| UnicastSubject | back to summary |
|---|---|
| pack-priv UnicastSubject(int capacityHint, Runnable onTerminate, boolean delayError) Creates an UnicastSubject with the given capacity hint, delay error flag and callback for when the Subject is terminated normally or its single Subscriber cancels. History: 2.0.8 - experimental
| |
| create | back to summary |
|---|---|
| public static <T> UnicastSubject Creates an UnicastSubject with an internal buffer capacity hint 16.
| |
| create | back to summary |
|---|---|
| public static <T> UnicastSubject Creates an UnicastSubject with the given internal buffer capacity hint.
| |
| create | back to summary |
|---|---|
| public static <T> UnicastSubject Creates an UnicastSubject with the given internal buffer capacity hint and a callback for the case when the single Subscriber cancels its subscription. The callback, if not null, is called exactly once and non-overlapped with any active replay.
| |
| create | back to summary |
|---|---|
| public static <T> UnicastSubject Creates an UnicastSubject with the given internal buffer capacity hint, delay error flag and a callback for the case when the single Subscriber cancels its subscription. The callback, if not null, is called exactly once and non-overlapped with any active replay. History: 2.0.8 - experimental
| |
| create | back to summary |
|---|---|
| public static <T> UnicastSubject Creates an UnicastSubject with an internal buffer capacity hint 16 and given delay error flag. The callback, if not null, is called exactly once and non-overlapped with any active replay. History: 2.0.8 - experimental
| |
| doTerminate | back to summary |
|---|---|
| pack-priv void doTerminate() | |
| drain | back to summary |
|---|---|
| pack-priv void drain() | |
| drainFused | back to summary |
|---|---|
| pack-priv void drainFused(Observer<? super T> a) | |
| drainNormal | back to summary |
|---|---|
| pack-priv void drainNormal(Observer<? super T> a) | |
| errorOrComplete | back to summary |
|---|---|
| pack-priv void errorOrComplete(Observer<? super T> a) | |
| failedFast | back to summary |
|---|---|
| pack-priv boolean failedFast(final SimpleQueue<T> q, Observer<? super T> a) | |
| getThrowable | back to summary |
|---|---|
| public Throwable getThrowable() Implements abstract io. Doc from io. Returns the error that caused the Subject to terminate or null if the Subject hasn't terminated yet. The method is thread-safe. | |
| hasComplete | back to summary |
|---|---|
| public boolean hasComplete() Implements abstract io. Doc from io. Returns true if the subject has reached a terminal state through a complete event. The method is thread-safe.
| |
| hasObservers | back to summary |
|---|---|
| public boolean hasObservers() Implements abstract io. Doc from io. Returns true if the subject has any Observers. The method is thread-safe.
| |
| hasThrowable | back to summary |
|---|---|
| public boolean hasThrowable() Implements abstract io. Doc from io. Returns true if the subject has reached a terminal state through an error event. The method is thread-safe.
| |
| onComplete | back to summary |
|---|---|
| public void onComplete() Implements io. Doc from io. Notifies the Observer that the
The
| |
| onError | back to summary |
|---|---|
| public void onError(Throwable t) Implements io. Doc from io. Notifies the Observer that the
If the | |
| onNext | back to summary |
|---|---|
| public void onNext(T t) Implements io. Doc from io. Provides the Observer with a new item to observe.
The
The
| |
| onSubscribe | back to summary |
|---|---|
| public void onSubscribe(Disposable d) Implements io. Doc from io. Provides the Observer with the means of cancelling (disposing) the
connection (channel) with the Observable in both
synchronous (from within
| |
| subscribeActual | back to summary |
|---|---|
| protected void subscribeActual(Observer<? super T> observer) Implements abstract io. Doc from io. Operator implementations (both source and intermediate) should implement this method that
performs the necessary business logic and handles the incoming There is no need to call any of the plugin hooks on the current | |
| Modifier and Type | Field and Description |
|---|---|
| private static final long |
| Access | Constructor and Description |
|---|---|
| pack-priv |
| Modifier and Type | Method and Description |
|---|---|
| public void | clear()
Implements io. |
| public void | dispose()
Implements io. |
| public boolean | isDisposed()
Implements io. |
| public boolean | isEmpty()
Implements io. |
| public T | poll()
Implements io. |
| public int | requestFusion(int mode)
Implements io. |
| serialVersionUID | back to summary |
|---|---|
| private static final long serialVersionUID Hides io. | |
| UnicastQueueDisposable | back to summary |
|---|---|
| pack-priv UnicastQueueDisposable() | |
| clear | back to summary |
|---|---|
| public void clear() Implements io. Doc from io. Removes all enqueued items from this queue.
| |
| dispose | back to summary |
|---|---|
| public void dispose() Implements io. Doc from io. Dispose the resource, the operation should be idempotent.
| |
| isDisposed | back to summary |
|---|---|
| public boolean isDisposed() Implements io. Doc from io. Returns true if this resource has been disposed.
| |
| isEmpty | back to summary |
|---|---|
| public boolean isEmpty() Implements io. Doc from io. Returns true if the queue is empty.
Note however that due to potential fused functions in
| |
| poll | back to summary |
|---|---|
| public T poll() throws Exception Implements io. Doc from io. Tries to dequeue a value (non-null) or returns null if the queue is empty.
If the producer uses | |
| requestFusion | back to summary |
|---|---|
| public int requestFusion(int mode) Implements io. Doc from io. Request a fusion mode from the upstream.
This should be called before
Calling this method multiple times or after
| |