Class SingleSubject<T>
- java.lang.Object
-
- io.reactivex.rxjava3.core.Single<T>
-
- io.reactivex.rxjava3.subjects.SingleSubject<T>
-
- Type Parameters:
T- the value type received and emitted
- All Implemented Interfaces:
SingleObserver<T>,SingleSource<T>
public final class SingleSubject<T> extends Single<T> implements SingleObserver<T>
Represents a hot Single-like source and consumer of events similar to Subjects.
This subject does not have a public constructor by design; a new non-terminated instance of this
SingleSubjectcan be created via thecreate()method.Since the
SingleSubjectis conceptionally derived from theProcessortype in the Reactive Streams specification,nulls are not allowed (Rule 2.13) as parameters toonSuccess(Object)andonError(Throwable). Such calls will result in aNullPointerExceptionbeing thrown and the subject's state is not changed.Since a
SingleSubjectis aSingle, callingonSuccessoronErrorwill move thisSingleSubjectinto its terminal state atomically.All methods are thread safe. Calling
onSuccess(Object)multiple times has no effect. CallingonError(Throwable)multiple times relays theThrowableto theRxJavaPlugins.onError(Throwable)global error handler.Even though
SingleSubjectimplements theSingleObserverinterface, callingonSubscribeis not required (Rule 2.12) if the subject is used as a standalone source. However, callingonSubscribeafter theSingleSubjectreached its terminal state will result in the givenDisposablebeing disposed immediately.This
SingleSubjectsupports the standard state-peeking methodshasThrowable(),getThrowable()andhasObservers()as well as means to read any success item in a non-blocking and thread-safe manner viahasValue()andgetValue().The
SingleSubjectdoes not support clearing its cachedonSuccessvalue.- 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
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description (package private) static classSingleSubject.SingleDisposable<T>
-
Field Summary
Fields Modifier and Type Field Description (package private) static SingleSubject.SingleDisposable[]EMPTY(package private) java.lang.Throwableerror(package private) java.util.concurrent.atomic.AtomicReference<SingleSubject.SingleDisposable<T>[]>observers(package private) java.util.concurrent.atomic.AtomicBooleanonce(package private) static SingleSubject.SingleDisposable[]TERMINATED(package private) Tvalue
-
Constructor Summary
Constructors Constructor Description SingleSubject()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description (package private) booleanadd(@NonNull SingleSubject.SingleDisposable<T> inner)static <T> @NonNull SingleSubject<T>create()Creates a fresh SingleSubject.@Nullable java.lang.ThrowablegetThrowable()Returns the terminal error if this SingleSubject has been terminated with an error, null otherwise.TgetValue()Returns the success value if this SingleSubject was terminated with a success value.booleanhasObservers()Returns true if this SingleSubject has observers.booleanhasThrowable()Returns true if this SingleSubject has been terminated with an error.booleanhasValue()Returns true if this SingleSubject was terminated with a success value.(package private) intobserverCount()Returns the number of current observers.voidonError(@NonNull java.lang.Throwable e)Notifies theSingleObserverthat theSinglehas experienced an error condition.voidonSubscribe(@NonNull Disposable d)Provides theSingleObserverwith the means of cancelling (disposing) the connection (channel) with the Single in both synchronous (from withinonSubscribe(Disposable)itself) and asynchronous manner.voidonSuccess(T value)Notifies theSingleObserverwith a single item and that theSinglehas finished sending push-based notifications.(package private) voidremove(@NonNull SingleSubject.SingleDisposable<T> inner)protected voidsubscribeActual(@NonNull SingleObserver<? super T> observer)Implement this method in subclasses to handle the incomingSingleObservers.-
Methods inherited from class io.reactivex.rxjava3.core.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
-
-
-
-
Field Detail
-
observers
final java.util.concurrent.atomic.AtomicReference<SingleSubject.SingleDisposable<T>[]> observers
-
EMPTY
static final SingleSubject.SingleDisposable[] EMPTY
-
TERMINATED
static final SingleSubject.SingleDisposable[] TERMINATED
-
once
final java.util.concurrent.atomic.AtomicBoolean once
-
value
T value
-
error
java.lang.Throwable error
-
-
Method Detail
-
create
@CheckReturnValue @NonNull public static <T> @NonNull SingleSubject<T> create()
Creates a fresh SingleSubject.- Type Parameters:
T- the value type received and emitted- Returns:
- the new SingleSubject instance
-
onSubscribe
public void onSubscribe(@NonNull @NonNull Disposable d)
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
public void onSuccess(@NonNull T value)
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(java.lang.Throwable).- Specified by:
onSuccessin interfaceSingleObserver<T>- Parameters:
value- the item emitted by theSingle
-
onError
public void onError(@NonNull @NonNull java.lang.Throwable e)
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
protected void subscribeActual(@NonNull @NonNull SingleObserver<? super T> observer)
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
-
add
boolean add(@NonNull @NonNull SingleSubject.SingleDisposable<T> inner)
-
remove
void remove(@NonNull @NonNull SingleSubject.SingleDisposable<T> inner)
-
getValue
@Nullable public T getValue()
Returns the success value if this SingleSubject was terminated with a success value.- Returns:
- the success value or null
-
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
@Nullable public @Nullable java.lang.Throwable getThrowable()
Returns the terminal error if this SingleSubject has been terminated with an error, null otherwise.- Returns:
- the terminal error or null if not terminated or not with an error
-
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
-
observerCount
int observerCount()
Returns the number of current observers.- Returns:
- the number of current observers
-
-