T - the value type received and emitted by this Subject subclasspublic final classUnicastSubject<T>extendsSubject<T>
Observer subscribes to it, replays those events to it until theObserver catches up and then switches to relaying events live to this singleObserver until thisUnicastSubject terminates or theObserver unsubscribes.
Note thatUnicastSubject holds an unbounded internal buffer.
This subject does not have a public constructor by design; a new empty instance of thisUnicastSubject can be created via the followingcreate methods that allow specifying the retention policy for items:
create() - creates an empty, unboundedUnicastSubject that caches all items and the terminal event it receives.create(int) - creates an empty, unboundedUnicastSubject with a hint about how manytotal items one expects to retain.create(boolean) - creates an empty, unboundedUnicastSubject that optionally delays an error it receives and replays it after the regular items have been emitted.create(int, Runnable) - creates an empty, unboundedUnicastSubject with a hint about how manytotal items one expects to retain and a callback that will be called exactly once when theUnicastSubject gets terminated or the singleObserver unsubscribes.create(int, Runnable, boolean) - creates an empty, unboundedUnicastSubject with a hint about how manytotal items one expects to retain and a callback that will be called exactly once when theUnicastSubject gets terminated or the singleObserver unsubscribes and optionally delays an error it receives and replays it after the regular items have been emitted. If more than oneObserver attempts to subscribe to thisUnicastSubject, they will receive anIllegalStateException indicating the single-use-only nature of thisUnicastSubject, even if theUnicastSubject already terminated with an error.
Since aSubject is conceptionally derived from theProcessor type in the Reactive Streams specification,nulls are not allowed (Rule 2.13) as parameters toonNext(Object) andonError(Throwable). Such calls will result in aNullPointerException being thrown and the subject's state is not changed.
Since aUnicastSubject is anObservable, it does not support backpressure.
When thisUnicastSubject is terminated viaonError(Throwable) the current or late singleObserver may receive theThrowable before any available items could be emitted. To make sure an onError event is delivered to theObserver after the normal items, create aUnicastSubject with thecreate(boolean) orcreate(int, Runnable, boolean) factory methods.
Even thoughUnicastSubject implements theObserver interface, callingonSubscribe is not required (Rule 2.12) if the subject is used as a standalone source. However, callingonSubscribe after theUnicastSubject reached its terminal state will result in the givenDisposable being disposed immediately.
CallingonNext(Object),onError(Throwable) andonComplete() is required to be serialized (called from the same thread or called non-overlappingly from different threads through external means of serialization). TheSubject.toSerialized() method available to allSubjects provides such serialization and also protects against reentrance (i.e., when a downstreamObserver consuming this subject also wants to callonNext(Object) on this subject recursively).
ThisUnicastSubject supports the standard state-peeking methodshasComplete(),hasThrowable(),getThrowable() andhasObservers().
UnicastSubject does not operate by default on a particularScheduler and the singleObserver gets notified on the thread the respectiveonXXX methods were invoked.onError(Throwable) is called, theUnicastSubject enters into a terminal state and emits the sameThrowable instance to the current singleObserver. During this emission, if the singleObservers disposes its respectiveDisposable, theThrowable is delivered to the global error handler viaRxJavaPlugins.onError(Throwable). If there were noObservers subscribed to thisUnicastSubject when theonError() 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 | Method and Description |
|---|---|
static <T> UnicastSubject<T> | create()Creates an UnicastSubject with an internal buffer capacity hint 16. |
static <T> UnicastSubject<T> | create(boolean delayError)Creates an UnicastSubject with an internal buffer capacity hint 16 and given delay error flag. |
static <T> UnicastSubject<T> | create(int capacityHint)Creates an UnicastSubject with the given internal buffer capacity hint. |
static <T> UnicastSubject<T> | create(int capacityHint,Runnable onTerminate)Creates an UnicastSubject with the given internal buffer capacity hint and a callback for the case when the single Subscriber cancels its subscription. |
static <T> UnicastSubject<T> | create(int capacityHint,Runnable onTerminate, boolean 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. |
Throwable | getThrowable()Returns the error that caused the Subject to terminate or null if the Subject hasn't terminated yet. |
boolean | hasComplete()Returns true if the subject has reached a terminal state through a complete event. |
boolean | hasObservers()Returns true if the subject has any Observers. |
boolean | hasThrowable()Returns true if the subject has reached a terminal state through an error event. |
void | onComplete()Notifies the Observer that the Observable has finished sending push-based notifications. |
void | onError(Throwable t)Notifies the Observer that the Observable has experienced an error condition. |
void | onNext(T t)Provides the Observer with a new item to observe. |
void | onSubscribe(Disposable d)Provides the Observer with the means of cancelling (disposing) the connection (channel) with the Observable in both synchronous (from within Observer.onNext(Object)) and asynchronous manner. |
protected void | subscribeActual(Observer<? superT> observer)Operator implementations (both source and intermediate) should implement this method that performs the necessary business logic and handles the incoming Observers. |
toSerializedall,amb,ambArray,ambWith,any,as,blockingFirst,blockingFirst,blockingForEach,blockingIterable,blockingIterable,blockingLast,blockingLast,blockingLatest,blockingMostRecent,blockingNext,blockingSingle,blockingSingle,blockingSubscribe,blockingSubscribe,blockingSubscribe,blockingSubscribe,blockingSubscribe,buffer,buffer,buffer,buffer,buffer,buffer,buffer,buffer,buffer,buffer,buffer,buffer,buffer,buffer,buffer,buffer,buffer,buffer,buffer,bufferSize,cache,cacheWithInitialCapacity,cast,collect,collectInto,combineLatest,combineLatest,combineLatest,combineLatest,combineLatest,combineLatest,combineLatest,combineLatest,combineLatest,combineLatest,combineLatest,combineLatest,combineLatest,combineLatestDelayError,combineLatestDelayError,combineLatestDelayError,combineLatestDelayError,combineLatestDelayError,compose,concat,concat,concat,concat,concat,concat,concatArray,concatArrayDelayError,concatArrayEager,concatArrayEager,concatArrayEagerDelayError,concatArrayEagerDelayError,concatDelayError,concatDelayError,concatDelayError,concatEager,concatEager,concatEager,concatEager,concatMap,concatMap,concatMapCompletable,concatMapCompletable,concatMapCompletableDelayError,concatMapCompletableDelayError,concatMapCompletableDelayError,concatMapDelayError,concatMapDelayError,concatMapEager,concatMapEager,concatMapEagerDelayError,concatMapEagerDelayError,concatMapIterable,concatMapIterable,concatMapMaybe,concatMapMaybe,concatMapMaybeDelayError,concatMapMaybeDelayError,concatMapMaybeDelayError,concatMapSingle,concatMapSingle,concatMapSingleDelayError,concatMapSingleDelayError,concatMapSingleDelayError,concatWith,concatWith,concatWith,concatWith,contains,count,create,debounce,debounce,debounce,defaultIfEmpty,defer,delay,delay,delay,delay,delay,delay,delaySubscription,delaySubscription,delaySubscription,dematerialize,dematerialize,distinct,distinct,distinct,distinctUntilChanged,distinctUntilChanged,distinctUntilChanged,doAfterNext,doAfterTerminate,doFinally,doOnComplete,doOnDispose,doOnEach,doOnEach,doOnError,doOnLifecycle,doOnNext,doOnSubscribe,doOnTerminate,elementAt,elementAt,elementAtOrError,empty,error,error,filter,first,firstElement,firstOrError,flatMap,flatMap,flatMap,flatMap,flatMap,flatMap,flatMap,flatMap,flatMap,flatMap,flatMap,flatMap,flatMapCompletable,flatMapCompletable,flatMapIterable,flatMapIterable,flatMapMaybe,flatMapMaybe,flatMapSingle,flatMapSingle,forEach,forEachWhile,forEachWhile,forEachWhile,fromArray,fromCallable,fromFuture,fromFuture,fromFuture,fromFuture,fromIterable,fromPublisher,generate,generate,generate,generate,generate,groupBy,groupBy,groupBy,groupBy,groupBy,groupJoin,hide,ignoreElements,interval,interval,interval,interval,intervalRange,intervalRange,isEmpty,join,just,just,just,just,just,just,just,just,just,just,last,lastElement,lastOrError,lift,map,materialize,merge,merge,merge,merge,merge,merge,merge,merge,mergeArray,mergeArray,mergeArrayDelayError,mergeArrayDelayError,mergeDelayError,mergeDelayError,mergeDelayError,mergeDelayError,mergeDelayError,mergeDelayError,mergeDelayError,mergeDelayError,mergeWith,mergeWith,mergeWith,mergeWith,never,observeOn,observeOn,observeOn,ofType,onErrorResumeNext,onErrorResumeNext,onErrorReturn,onErrorReturnItem,onExceptionResumeNext,onTerminateDetach,publish,publish,range,rangeLong,reduce,reduce,reduceWith,repeat,repeat,repeatUntil,repeatWhen,replay,replay,replay,replay,replay,replay,replay,replay,replay,replay,replay,replay,replay,replay,replay,replay,retry,retry,retry,retry,retry,retryUntil,retryWhen,safeSubscribe,sample,sample,sample,sample,sample,sample,scan,scan,scanWith,sequenceEqual,sequenceEqual,sequenceEqual,sequenceEqual,serialize,share,single,singleElement,singleOrError,skip,skip,skip,skipLast,skipLast,skipLast,skipLast,skipLast,skipLast,skipUntil,skipWhile,sorted,sorted,startWith,startWith,startWith,startWithArray,subscribe,subscribe,subscribe,subscribe,subscribe,subscribe,subscribeOn,subscribeWith,switchIfEmpty,switchMap,switchMap,switchMapCompletable,switchMapCompletableDelayError,switchMapDelayError,switchMapDelayError,switchMapMaybe,switchMapMaybeDelayError,switchMapSingle,switchMapSingleDelayError,switchOnNext,switchOnNext,switchOnNextDelayError,switchOnNextDelayError,take,take,take,takeLast,takeLast,takeLast,takeLast,takeLast,takeLast,takeLast,takeLast,takeLast,takeUntil,takeUntil,takeWhile,test,test,throttleFirst,throttleFirst,throttleLast,throttleLast,throttleLatest,throttleLatest,throttleLatest,throttleLatest,throttleWithTimeout,throttleWithTimeout,timeInterval,timeInterval,timeInterval,timeInterval,timeout,timeout,timeout,timeout,timeout,timeout,timeout,timeout,timer,timer,timestamp,timestamp,timestamp,timestamp,to,toFlowable,toFuture,toList,toList,toList,toMap,toMap,toMap,toMultimap,toMultimap,toMultimap,toMultimap,toSortedList,toSortedList,toSortedList,toSortedList,unsafeCreate,unsubscribeOn,using,using,window,window,window,window,window,window,window,window,window,window,window,window,window,window,window,window,window,window,window,withLatestFrom,withLatestFrom,withLatestFrom,withLatestFrom,withLatestFrom,withLatestFrom,wrap,zip,zip,zip,zip,zip,zip,zip,zip,zip,zip,zip,zip,zipArray,zipIterable,zipWith,zipWith,zipWith,zipWith@CheckReturnValue@NonNullpublic static <T> UnicastSubject<T> create()
T - the value type@CheckReturnValue@NonNullpublic static <T> UnicastSubject<T> create(int capacityHint)
T - the value typecapacityHint - the hint to size the internal unbounded buffer@CheckReturnValue@NonNullpublic static <T> UnicastSubject<T> create(int capacityHint,Runnable onTerminate)
The callback, if not null, is called exactly once and non-overlapped with any active replay.
T - the value typecapacityHint - the hint to size the internal unbounded bufferonTerminate - the callback to run when the Subject is terminated or cancelled, null not allowed@CheckReturnValue@NonNullpublic static <T> UnicastSubject<T> create(int capacityHint,Runnable onTerminate, boolean delayError)
The callback, if not null, is called exactly once and non-overlapped with any active replay.
History: 2.0.8 - experimental
T - the value typecapacityHint - the hint to size the internal unbounded bufferonTerminate - the callback to run when the Subject is terminated or cancelled, null not alloweddelayError - deliver pending onNext events before onError@CheckReturnValue@NonNullpublic static <T> UnicastSubject<T> create(boolean delayError)
The callback, if not null, is called exactly once and non-overlapped with any active replay.
History: 2.0.8 - experimental
T - the value typedelayError - deliver pending onNext events before onErrorprotected void subscribeActual(Observer<? superT> observer)
ObservableObservers.There is no need to call any of the plugin hooks on the currentObservable instance or theObserver; all hooks and basic safeguards have been applied byObservable.subscribe(Observer) before this method gets called.
subscribeActual in class Observable<T>observer - the incoming Observer, never nullpublic void onSubscribe(Disposable d)
ObserverObserver.onNext(Object)) and asynchronous manner.d - the Disposable instance whoseDisposable.dispose() can be called anytime to cancel the connectionpublic void onNext(T t)
Observer TheObservable may call this method 0 or more times.
TheObservable will not call this method again after it calls eitherObserver.onComplete() orObserver.onError(java.lang.Throwable).
t - the item emitted by the Observablepublic void onError(Throwable t)
ObserverObservable has experienced an error condition. If theObservable calls this method, it will not thereafter callObserver.onNext(T) orObserver.onComplete().
t - the exception encountered by the Observablepublic void onComplete()
ObserverObservable has finished sending push-based notifications. TheObservable will not call this method if it callsObserver.onError(java.lang.Throwable).
public boolean hasObservers()
SubjectThe method is thread-safe.
hasObservers in class Subject<T>@Nullablepublic Throwable getThrowable()
SubjectThe method is thread-safe.
getThrowable in class Subject<T>public boolean hasThrowable()
SubjectThe method is thread-safe.
hasThrowable in class Subject<T>Subject.getThrowable(),Subject.hasComplete()public boolean hasComplete()
SubjectThe method is thread-safe.
hasComplete in class Subject<T>Subject.hasThrowable()