Class SingleSubject<T>
- Type Parameters:
T- the value type received and emitted
- All Implemented Interfaces:
SingleObserver<T>, SingleSource<T>
This subject does not have a public constructor by design; a new non-terminated instance of this
SingleSubject can be created via the create() method.
Since the SingleSubject is conceptionally derived from the Processor type in the Reactive Streams specification,
nulls are not allowed (Rule 2.13)
as parameters to onSuccess(Object) and onError(Throwable). Such calls will result in a
NullPointerException being thrown and the subject's state is not changed.
Since a SingleSubject is a Single, calling onSuccess or onError
will move this SingleSubject into its terminal state atomically.
All methods are thread safe. Calling onSuccess(Object) multiple
times has no effect. Calling onError(Throwable) multiple times relays the Throwable to
the RxJavaPlugins.onError(Throwable) global error handler.
Even though SingleSubject implements the SingleObserver interface, calling
onSubscribe is not required (Rule 2.12)
if the subject is used as a standalone source. However, calling onSubscribe
after the SingleSubject reached its terminal state will result in the
given Disposable being disposed immediately.
This SingleSubject supports the standard state-peeking methods hasThrowable(),
getThrowable() and hasObservers() as well as means to read any success item in a non-blocking
and thread-safe manner via hasValue() and getValue().
The SingleSubject does not support clearing its cached onSuccess value.
- Scheduler:
SingleSubjectdoes not operate by default on a particularSchedulerand theSingleObservers get notified on the thread where the terminatingonSuccessoronErrormethods were invoked.- Error handling:
- When the
onError(Throwable)is called, theSingleSubjectenters into a terminal state and emits the sameThrowableinstance to the last set ofSingleObservers. During this emission, if one or moreSingleObservers dispose their respectiveDisposables, theThrowableis delivered to the global error handler viaRxJavaPlugins.onError(Throwable)(multiple times if multipleSingleObservers cancel at once). If there were noSingleObservers subscribed to thisSingleSubjectwhen theonError()was called, the global error handler is not invoked.
Example usage:
SingleSubject<Integer> subject1 = SingleSubject.create();
TestObserver<Integer> to1 = subject1.test();
// SingleSubjects are empty by default
to1.assertEmpty();
subject1.onSuccess(1);
// onSuccess is a terminal event with SingleSubjects
// TestObserver converts onSuccess into onNext + onComplete
to1.assertResult(1);
TestObserver<Integer> to2 = subject1.test();
// late Observers receive the terminal signal (onSuccess) too
to2.assertResult(1);
History: 2.0.5 - experimental
- Since:
- 2.1
-
Method Summary
Modifier and TypeMethodDescriptionstatic <T> @NonNull SingleSubject<T> create()Creates a fresh SingleSubject.Returns the terminal error if this SingleSubject has been terminated with an error, null otherwise.getValue()Returns the success value if this SingleSubject was terminated with a success value.booleanReturns true if this SingleSubject has observers.booleanReturns true if this SingleSubject has been terminated with an error.booleanhasValue()Returns true if this SingleSubject was terminated with a success value.voidNotifies theSingleObserverthat theSinglehas experienced an error condition.voidProvides theSingleObserverwith the means of cancelling (disposing) the connection (channel) with the Single in both synchronous (from withinonSubscribe(Disposable)itself) and asynchronous manner.voidNotifies theSingleObserverwith a single item and that theSinglehas finished sending push-based notifications.protected voidsubscribeActual(@NonNull SingleObserver<? super T> observer) Implement this method in subclasses to handle the incomingSingleObservers.Methods inherited from class Single
amb, ambArray, ambWith, blockingGet, blockingSubscribe, blockingSubscribe, blockingSubscribe, blockingSubscribe, cache, cast, compose, concat, concat, concat, concat, concat, concat, concat, concatArray, concatArrayDelayError, concatArrayEager, concatArrayEagerDelayError, concatDelayError, concatDelayError, concatDelayError, concatEager, concatEager, concatEager, concatEager, concatEagerDelayError, concatEagerDelayError, concatEagerDelayError, concatEagerDelayError, concatMap, concatMapCompletable, concatMapMaybe, concatWith, contains, contains, create, defer, delay, delay, delay, delay, delaySubscription, delaySubscription, delaySubscription, delaySubscription, delaySubscription, delaySubscription, dematerialize, doAfterSuccess, doAfterTerminate, doFinally, doOnDispose, doOnError, doOnEvent, doOnLifecycle, doOnSubscribe, doOnSuccess, doOnTerminate, error, error, filter, flatMap, flatMap, flatMap, flatMapCompletable, flatMapMaybe, flatMapObservable, flatMapPublisher, flattenAsFlowable, flattenAsObservable, flattenStreamAsFlowable, flattenStreamAsObservable, fromCallable, fromCompletionStage, fromFuture, fromFuture, fromMaybe, fromMaybe, fromObservable, fromPublisher, fromSupplier, hide, ignoreElement, just, lift, map, mapOptional, materialize, merge, merge, merge, merge, merge, merge, mergeArray, mergeArrayDelayError, mergeDelayError, mergeDelayError, mergeDelayError, mergeDelayError, mergeDelayError, mergeWith, never, observeOn, ofType, onErrorComplete, onErrorComplete, onErrorResumeNext, onErrorResumeWith, onErrorReturn, onErrorReturnItem, onTerminateDetach, repeat, repeat, repeatUntil, repeatWhen, retry, retry, retry, retry, retry, retryUntil, retryWhen, safeSubscribe, sequenceEqual, startWith, startWith, startWith, startWith, startWith, subscribe, subscribe, subscribe, subscribe, subscribe, subscribe, subscribeOn, subscribeWith, switchOnNext, switchOnNextDelayError, takeUntil, takeUntil, takeUntil, test, test, timeInterval, timeInterval, timeInterval, timeInterval, timeout, timeout, timeout, timeout, timer, timer, timestamp, timestamp, timestamp, timestamp, to, toCompletionStage, toFlowable, toFuture, toMaybe, toObservable, unsafeCreate, unsubscribeOn, using, using, wrap, zip, zip, zip, zip, zip, zip, zip, zip, zip, zipArray, zipWith
-
Method Details
-
create
Creates a fresh SingleSubject.- Type Parameters:
T- the value type received and emitted- Returns:
- the new SingleSubject instance
-
onSubscribe
Description copied from interface:SingleObserverProvides theSingleObserverwith the means of cancelling (disposing) the connection (channel) with the Single in both synchronous (from withinonSubscribe(Disposable)itself) and asynchronous manner.- Specified by:
onSubscribein interfaceSingleObserver<T>- Parameters:
d- the Disposable instance whoseDisposable.dispose()can be called anytime to cancel the connection
-
onSuccess
Description copied from interface:SingleObserverNotifies theSingleObserverwith a single item and that theSinglehas finished sending push-based notifications.The
Singlewill not call this method if it callsSingleObserver.onError(Throwable).- Specified by:
onSuccessin interfaceSingleObserver<T>- Parameters:
value- the item emitted by theSingle
-
onError
Description copied from interface:SingleObserverNotifies theSingleObserverthat theSinglehas experienced an error condition.If the
Singlecalls this method, it will not thereafter callSingleObserver.onSuccess(T).- Specified by:
onErrorin interfaceSingleObserver<T>- Parameters:
e- the exception encountered by theSingle
-
subscribeActual
Description copied from class:SingleImplement this method in subclasses to handle the incomingSingleObservers.There is no need to call any of the plugin hooks on the current
Singleinstance or theSingleObserver; all hooks and basic safeguards have been applied bySingle.subscribe(SingleObserver)before this method gets called.- Specified by:
subscribeActualin classSingle<T>- Parameters:
observer- theSingleObserverto handle, notnull
-
getValue
-
hasValue
public boolean hasValue()Returns true if this SingleSubject was terminated with a success value.- Returns:
- true if this SingleSubject was terminated with a success value
-
getThrowable
-
hasThrowable
public boolean hasThrowable()Returns true if this SingleSubject has been terminated with an error.- Returns:
- true if this SingleSubject has been terminated with an error
-
hasObservers
public boolean hasObservers()Returns true if this SingleSubject has observers.- Returns:
- true if this SingleSubject has observers
-