Class MaybeSubject<T>
- java.lang.Object
-
- io.reactivex.rxjava3.core.Maybe<T>
-
- io.reactivex.rxjava3.subjects.MaybeSubject<T>
-
- Type Parameters:
T- the value type received and emitted
- All Implemented Interfaces:
MaybeObserver<T>,MaybeSource<T>
public final class MaybeSubject<T> extends Maybe<T> implements MaybeObserver<T>
Represents a hot Maybe-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
MaybeSubjectcan be created via thecreate()method.Since the
MaybeSubjectis 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
MaybeSubjectis aMaybe, callingonSuccess,onErrororonCompletewill move thisMaybeSubjectinto its terminal state atomically.All methods are thread safe. Calling
onSuccess(Object)oronComplete()multiple times has no effect. CallingonError(Throwable)multiple times relays theThrowableto theRxJavaPlugins.onError(Throwable)global error handler.Even though
MaybeSubjectimplements theMaybeObserverinterface, callingonSubscribeis not required (Rule 2.12) if the subject is used as a standalone source. However, callingonSubscribeafter theMaybeSubjectreached its terminal state will result in the givenDisposablebeing disposed immediately.This
MaybeSubjectsupports the standard state-peeking methodshasComplete(),hasThrowable(),getThrowable()andhasObservers()as well as means to read any success item in a non-blocking and thread-safe manner viahasValue()andgetValue().The
MaybeSubjectdoes not support clearing its cachedonSuccessvalue.- Scheduler:
MaybeSubjectdoes not operate by default on a particularSchedulerand theMaybeObservers get notified on the thread where the terminatingonSuccess,onErrororonCompletemethods were invoked.- Error handling:
- When the
onError(Throwable)is called, theMaybeSubjectenters into a terminal state and emits the sameThrowableinstance to the last set ofMaybeObservers. During this emission, if one or moreMaybeObservers dispose their respectiveDisposables, theThrowableis delivered to the global error handler viaRxJavaPlugins.onError(Throwable)(multiple times if multipleMaybeObservers cancel at once). If there were noMaybeObservers subscribed to thisMaybeSubjectwhen theonError()was called, the global error handler is not invoked.
Example usage:
MaybeSubject<Integer> subject1 = MaybeSubject.create(); TestObserver<Integer> to1 = subject1.test(); // MaybeSubjects are empty by default to1.assertEmpty(); subject1.onSuccess(1); // onSuccess is a terminal event with MaybeSubjects // 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); // ----------------------------------------------------- MaybeSubject<Integer> subject2 = MaybeSubject.create(); TestObserver<Integer> to3 = subject2.test(); subject2.onComplete(); // a completed MaybeSubject completes its MaybeObservers to3.assertResult(); TestObserver<Integer> to4 = subject1.test(); // late Observers receive the terminal signal (onComplete) too to4.assertResult();History: 2.0.5 - experimental
- Since:
- 2.1
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description (package private) static classMaybeSubject.MaybeDisposable<T>
-
Field Summary
Fields Modifier and Type Field Description (package private) static MaybeSubject.MaybeDisposable[]EMPTY(package private) java.lang.Throwableerror(package private) java.util.concurrent.atomic.AtomicReference<MaybeSubject.MaybeDisposable<T>[]>observers(package private) java.util.concurrent.atomic.AtomicBooleanonce(package private) static MaybeSubject.MaybeDisposable[]TERMINATED(package private) Tvalue
-
Constructor Summary
Constructors Constructor Description MaybeSubject()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description (package private) booleanadd(MaybeSubject.MaybeDisposable<T> inner)static <T> @NonNull MaybeSubject<T>create()Creates a fresh MaybeSubject.@Nullable java.lang.ThrowablegetThrowable()Returns the terminal error if this MaybeSubject has been terminated with an error, null otherwise.TgetValue()Returns the success value if this MaybeSubject was terminated with a success value.booleanhasComplete()Returns true if this MaybeSubject has been completed.booleanhasObservers()Returns true if this MaybeSubject has observers.booleanhasThrowable()Returns true if this MaybeSubject has been terminated with an error.booleanhasValue()Returns true if this MaybeSubject was terminated with a success value.(package private) intobserverCount()Returns the number of current observers.voidonComplete()Called once the deferred computation completes normally.voidonError(java.lang.Throwable e)Notifies theMaybeObserverthat theMaybehas experienced an error condition.voidonSubscribe(Disposable d)Provides theMaybeObserverwith the means of cancelling (disposing) the connection (channel) with theMaybein both synchronous (from withinonSubscribe(Disposable)itself) and asynchronous manner.voidonSuccess(T value)Notifies theMaybeObserverwith one item and that theMaybehas finished sending push-based notifications.(package private) voidremove(MaybeSubject.MaybeDisposable<T> inner)protected voidsubscribeActual(MaybeObserver<? super T> observer)Implement this method in subclasses to handle the incomingMaybeObservers.-
Methods inherited from class io.reactivex.rxjava3.core.Maybe
amb, ambArray, ambWith, blockingGet, blockingGet, blockingSubscribe, blockingSubscribe, blockingSubscribe, blockingSubscribe, blockingSubscribe, cache, cast, compose, concat, concat, concat, concat, concat, concat, concatArray, concatArrayDelayError, concatArrayEager, concatArrayEagerDelayError, concatDelayError, concatDelayError, concatDelayError, concatEager, concatEager, concatEager, concatEager, concatEagerDelayError, concatEagerDelayError, concatEagerDelayError, concatEagerDelayError, concatMap, concatMapCompletable, concatMapSingle, concatWith, contains, count, create, defaultIfEmpty, defer, delay, delay, delay, delay, delay, delaySubscription, delaySubscription, delaySubscription, dematerialize, doAfterSuccess, doAfterTerminate, doFinally, doOnComplete, doOnDispose, doOnError, doOnEvent, doOnLifecycle, doOnSubscribe, doOnSuccess, doOnTerminate, empty, error, error, filter, flatMap, flatMap, flatMap, flatMapCompletable, flatMapObservable, flatMapPublisher, flatMapSingle, flattenAsFlowable, flattenAsObservable, flattenStreamAsFlowable, flattenStreamAsObservable, fromAction, fromCallable, fromCompletable, fromCompletionStage, fromFuture, fromFuture, fromObservable, fromOptional, fromPublisher, fromRunnable, fromSingle, fromSupplier, hide, ignoreElement, isEmpty, just, lift, map, mapOptional, materialize, merge, merge, merge, merge, merge, merge, merge, mergeArray, mergeArrayDelayError, mergeDelayError, 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, sequenceEqual, startWith, startWith, startWith, startWith, startWith, subscribe, subscribe, subscribe, subscribe, subscribe, subscribe, subscribeOn, subscribeWith, switchIfEmpty, switchIfEmpty, switchOnNext, switchOnNextDelayError, takeUntil, takeUntil, test, test, timeInterval, timeInterval, timeInterval, timeInterval, timeout, timeout, timeout, timeout, timeout, timeout, timeout, timeout, timer, timer, timestamp, timestamp, timestamp, timestamp, to, toCompletionStage, toCompletionStage, toFlowable, toFuture, toObservable, toSingle, 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<MaybeSubject.MaybeDisposable<T>[]> observers
-
EMPTY
static final MaybeSubject.MaybeDisposable[] EMPTY
-
TERMINATED
static final MaybeSubject.MaybeDisposable[] 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 MaybeSubject<T> create()
Creates a fresh MaybeSubject.- Type Parameters:
T- the value type received and emitted- Returns:
- the new MaybeSubject instance
-
onSubscribe
public void onSubscribe(Disposable d)
Description copied from interface:MaybeObserverProvides theMaybeObserverwith the means of cancelling (disposing) the connection (channel) with theMaybein both synchronous (from withinonSubscribe(Disposable)itself) and asynchronous manner.- Specified by:
onSubscribein interfaceMaybeObserver<T>- Parameters:
d- theDisposableinstance whoseDisposable.dispose()can be called anytime to cancel the connection
-
onSuccess
public void onSuccess(T value)
Description copied from interface:MaybeObserverNotifies theMaybeObserverwith one item and that theMaybehas finished sending push-based notifications.The
Maybewill not call this method if it callsMaybeObserver.onError(java.lang.Throwable).- Specified by:
onSuccessin interfaceMaybeObserver<T>- Parameters:
value- the item emitted by theMaybe
-
onError
public void onError(java.lang.Throwable e)
Description copied from interface:MaybeObserverNotifies theMaybeObserverthat theMaybehas experienced an error condition.If the
Maybecalls this method, it will not thereafter callMaybeObserver.onSuccess(T).- Specified by:
onErrorin interfaceMaybeObserver<T>- Parameters:
e- the exception encountered by theMaybe
-
onComplete
public void onComplete()
Description copied from interface:MaybeObserverCalled once the deferred computation completes normally.- Specified by:
onCompletein interfaceMaybeObserver<T>
-
subscribeActual
protected void subscribeActual(MaybeObserver<? super T> observer)
Description copied from class:MaybeImplement this method in subclasses to handle the incomingMaybeObservers.There is no need to call any of the plugin hooks on the current
Maybeinstance or theMaybeObserver; all hooks and basic safeguards have been applied byMaybe.subscribe(MaybeObserver)before this method gets called.- Specified by:
subscribeActualin classMaybe<T>- Parameters:
observer- theMaybeObserverto handle, notnull
-
add
boolean add(MaybeSubject.MaybeDisposable<T> inner)
-
remove
void remove(MaybeSubject.MaybeDisposable<T> inner)
-
getValue
@Nullable public T getValue()
Returns the success value if this MaybeSubject was terminated with a success value.- Returns:
- the success value or null
-
hasValue
public boolean hasValue()
Returns true if this MaybeSubject was terminated with a success value.- Returns:
- true if this MaybeSubject was terminated with a success value
-
getThrowable
@Nullable public @Nullable java.lang.Throwable getThrowable()
Returns the terminal error if this MaybeSubject 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 MaybeSubject has been terminated with an error.- Returns:
- true if this MaybeSubject has been terminated with an error
-
hasComplete
public boolean hasComplete()
Returns true if this MaybeSubject has been completed.- Returns:
- true if this MaybeSubject has been completed
-
hasObservers
public boolean hasObservers()
Returns true if this MaybeSubject has observers.- Returns:
- true if this MaybeSubject has observers
-
observerCount
int observerCount()
Returns the number of current observers.- Returns:
- the number of current observers
-
-