Class ReplaySubject<T>
- java.lang.Object
-
- io.reactivex.rxjava3.core.Observable<T>
-
- io.reactivex.rxjava3.subjects.Subject<T>
-
- io.reactivex.rxjava3.subjects.ReplaySubject<T>
-
- Type Parameters:
T
- the value type
- All Implemented Interfaces:
ObservableSource<T>
,Observer<T>
public final class ReplaySubject<T> extends Subject<T>
Replays events (in a configurable bounded or unbounded manner) to current and lateObserver
s.This subject does not have a public constructor by design; a new empty instance of this
ReplaySubject
can be created via the followingcreate
methods that allow specifying the retention policy for items:create()
- creates an empty, unboundedReplaySubject
that caches all items and the terminal event it receives.create(int)
- creates an empty, unboundedReplaySubject
with a hint about how many total items one expects to retain.createWithSize(int)
- creates an empty, size-boundReplaySubject
that retains at most the given number of the latest item it receives.createWithTime(long, TimeUnit, Scheduler)
- creates an empty, time-boundReplaySubject
that retains items no older than the specified time amount.createWithTimeAndSize(long, TimeUnit, Scheduler, int)
- creates an empty, time- and size-boundReplaySubject
that retains at most the given number items that are also not older than the specified time amount.
Since a
Subject
is conceptionally derived from theProcessor
type in the Reactive Streams specification,null
s 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 a
ReplaySubject
is anObservable
, it does not support backpressure.When this
ReplaySubject
is terminated viaonError(Throwable)
oronComplete()
, lateObserver
s will receive the retained/cached items first (if any) followed by the respective terminal event. If theReplaySubject
has a time-bound, the age of the retained/cached items are still considered when replaying and thus it may result in no items being emitted before the terminal event.Once an
Observer
has subscribed, it will receive items continuously from that point on. Bounds only affect how many past items a newObserver
will receive before it catches up with the live event feed.Even though
ReplaySubject
implements theObserver
interface, callingonSubscribe
is not required (Rule 2.12) if the subject is used as a standalone source. However, callingonSubscribe
after theReplaySubject
reached its terminal state will result in the givenDisposable
being disposed immediately.Calling
onNext(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 allSubject
s 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).This
ReplaySubject
supports the standard state-peeking methodshasComplete()
,hasThrowable()
,getThrowable()
andhasObservers()
as well as means to read the retained/cached items in a non-blocking and thread-safe manner viahasValue()
,getValue()
,getValues()
orgetValues(Object[])
.Note that due to concurrency requirements, a size- and time-bounded
ReplaySubject
may hold strong references to more source emissions than specified while it isn't terminated yet. Use thecleanupBuffer()
to allow such inaccessible items to be cleaned up by GC once no consumer references it anymore.- Scheduler:
ReplaySubject
does not operate by default on a particularScheduler
and theObserver
s get notified on the thread the respectiveonXXX
methods were invoked. Time-boundReplaySubject
s use the givenScheduler
in theircreate
methods as time source to timestamp of items received for the age checks.- Error handling:
- When the
onError(Throwable)
is called, theReplaySubject
enters into a terminal state and emits the sameThrowable
instance to the last set ofObserver
s. During this emission, if one or moreObserver
s dispose their respectiveDisposable
s, theThrowable
is delivered to the global error handler viaRxJavaPlugins.onError(Throwable)
(multiple times if multipleObserver
s cancel at once). If there were noObserver
s subscribed to thisReplaySubject
when theonError()
was called, the global error handler is not invoked.
Example usage:
ReplaySubject<Object> subject = ReplaySubject.create(); subject.onNext("one"); subject.onNext("two"); subject.onNext("three"); subject.onComplete(); // both of the following will get the onNext/onComplete calls from above subject.subscribe(observer1); subject.subscribe(observer2);
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description (package private) static class
ReplaySubject.Node<T>
(package private) static interface
ReplaySubject.ReplayBuffer<T>
Abstraction over a buffer that receives events and replays them to individual Observers.(package private) static class
ReplaySubject.ReplayDisposable<T>
(package private) static class
ReplaySubject.SizeAndTimeBoundReplayBuffer<T>
(package private) static class
ReplaySubject.SizeBoundReplayBuffer<T>
(package private) static class
ReplaySubject.TimedNode<T>
(package private) static class
ReplaySubject.UnboundedReplayBuffer<T>
-
Field Summary
Fields Modifier and Type Field Description (package private) ReplaySubject.ReplayBuffer<T>
buffer
(package private) boolean
done
(package private) static ReplaySubject.ReplayDisposable[]
EMPTY
private static java.lang.Object[]
EMPTY_ARRAY
An empty array to avoid allocation in getValues().(package private) java.util.concurrent.atomic.AtomicReference<ReplaySubject.ReplayDisposable<T>[]>
observers
(package private) static ReplaySubject.ReplayDisposable[]
TERMINATED
-
Constructor Summary
Constructors Constructor Description ReplaySubject(ReplaySubject.ReplayBuffer<T> buffer)
Constructs a ReplayProcessor with the given custom ReplayBuffer instance.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description (package private) boolean
add(ReplaySubject.ReplayDisposable<T> rs)
void
cleanupBuffer()
Makes sure the item cached by the head node in a bounded ReplaySubject is released (as it is never part of a replay).static <T> @NonNull ReplaySubject<T>
create()
Creates an unbounded replay subject.static <T> @NonNull ReplaySubject<T>
create(int capacityHint)
Creates an unbounded replay subject with the specified initial buffer capacity.(package private) static <T> ReplaySubject<T>
createUnbounded()
Creates an unbounded replay subject with the bounded-implementation for testing purposes.static <T> @NonNull ReplaySubject<T>
createWithSize(int maxSize)
Creates a size-bounded replay subject.static <T> @NonNull ReplaySubject<T>
createWithTime(long maxAge, @NonNull java.util.concurrent.TimeUnit unit, @NonNull Scheduler scheduler)
Creates a time-bounded replay subject.static <T> @NonNull ReplaySubject<T>
createWithTimeAndSize(long maxAge, @NonNull java.util.concurrent.TimeUnit unit, @NonNull Scheduler scheduler, int maxSize)
Creates a time- and size-bounded replay subject.@Nullable java.lang.Throwable
getThrowable()
Returns the error that caused the Subject to terminate or null if the Subject hasn't terminated yet.T
getValue()
Returns a single value the Subject currently has or null if no such value exists.java.lang.Object[]
getValues()
Returns an Object array containing snapshot all values of the Subject.T[]
getValues(T[] array)
Returns a typed array containing a snapshot of all values of the Subject.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.boolean
hasValue()
Returns true if the subject has any value.(package private) int
observerCount()
void
onComplete()
Notifies theObserver
that theObservable
has finished sending push-based notifications.void
onError(java.lang.Throwable t)
Notifies theObserver
that theObservable
has experienced an error condition.void
onNext(T t)
Provides theObserver
with a new item to observe.void
onSubscribe(Disposable d)
Provides theObserver
with the means of cancelling (disposing) the connection (channel) with theObservable
in both synchronous (from withinObserver.onNext(Object)
) and asynchronous manner.(package private) void
remove(ReplaySubject.ReplayDisposable<T> rs)
(package private) int
size()
protected void
subscribeActual(Observer<? super T> observer)
Operator implementations (both source and intermediate) should implement this method that performs the necessary business logic and handles the incomingObserver
s.(package private) ReplaySubject.ReplayDisposable<T>[]
terminate(java.lang.Object terminalValue)
-
Methods inherited from class io.reactivex.rxjava3.subjects.Subject
toSerialized
-
Methods inherited from class io.reactivex.rxjava3.core.Observable
all, amb, ambArray, ambWith, any, blockingFirst, blockingFirst, blockingForEach, blockingForEach, blockingIterable, blockingIterable, blockingLast, blockingLast, blockingLatest, blockingMostRecent, blockingNext, blockingSingle, blockingSingle, blockingStream, blockingStream, blockingSubscribe, blockingSubscribe, blockingSubscribe, blockingSubscribe, blockingSubscribe, buffer, buffer, buffer, buffer, buffer, buffer, buffer, buffer, buffer, buffer, buffer, buffer, buffer, buffer, buffer, buffer, buffer, bufferSize, cache, cacheWithInitialCapacity, cast, collect, collect, collectInto, combineLatest, combineLatest, combineLatest, combineLatest, combineLatest, combineLatest, combineLatest, combineLatest, combineLatest, combineLatest, combineLatestArray, combineLatestArray, combineLatestArrayDelayError, combineLatestArrayDelayError, combineLatestDelayError, combineLatestDelayError, compose, concat, concat, concat, concat, concat, concat, concatArray, concatArrayDelayError, concatArrayEager, concatArrayEager, concatArrayEagerDelayError, concatArrayEagerDelayError, concatDelayError, concatDelayError, concatDelayError, concatEager, concatEager, concatEager, concatEager, concatEagerDelayError, concatEagerDelayError, concatEagerDelayError, concatEagerDelayError, concatMap, concatMap, concatMap, concatMapCompletable, concatMapCompletable, concatMapCompletableDelayError, concatMapCompletableDelayError, concatMapCompletableDelayError, concatMapDelayError, concatMapDelayError, concatMapDelayError, concatMapEager, concatMapEager, concatMapEagerDelayError, concatMapEagerDelayError, concatMapIterable, concatMapMaybe, concatMapMaybe, concatMapMaybeDelayError, concatMapMaybeDelayError, concatMapMaybeDelayError, concatMapSingle, concatMapSingle, concatMapSingleDelayError, concatMapSingleDelayError, concatMapSingleDelayError, concatMapStream, concatWith, concatWith, concatWith, concatWith, contains, count, create, debounce, debounce, debounce, debounce, defaultIfEmpty, defer, delay, delay, delay, delay, delay, delay, delaySubscription, delaySubscription, delaySubscription, 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, firstOrErrorStage, firstStage, flatMap, flatMap, flatMap, flatMap, flatMap, flatMap, flatMap, flatMap, flatMap, flatMap, flatMap, flatMap, flatMapCompletable, flatMapCompletable, flatMapIterable, flatMapIterable, flatMapMaybe, flatMapMaybe, flatMapSingle, flatMapSingle, flatMapStream, forEach, forEachWhile, forEachWhile, forEachWhile, fromAction, fromArray, fromCallable, fromCompletable, fromCompletionStage, fromFuture, fromFuture, fromIterable, fromMaybe, fromOptional, fromPublisher, fromRunnable, fromSingle, fromStream, fromSupplier, 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, lastOrErrorStage, lastStage, lift, map, mapOptional, 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, onErrorComplete, onErrorComplete, onErrorResumeNext, onErrorResumeWith, onErrorReturn, onErrorReturnItem, 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, replay, replay, retry, retry, retry, retry, retry, retryUntil, retryWhen, safeSubscribe, sample, sample, sample, sample, sample, sample, sample, scan, scan, scanWith, sequenceEqual, sequenceEqual, sequenceEqual, sequenceEqual, serialize, share, single, singleElement, singleOrError, singleOrErrorStage, singleStage, skip, skip, skip, skipLast, skipLast, skipLast, skipLast, skipLast, skipLast, skipUntil, skipWhile, sorted, sorted, startWith, startWith, startWith, startWith, startWithArray, startWithItem, startWithIterable, 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, throttleFirst, throttleLast, throttleLast, throttleLast, throttleLatest, throttleLatest, throttleLatest, throttleLatest, throttleLatest, throttleWithTimeout, 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, withLatestFrom, withLatestFrom, withLatestFrom, withLatestFrom, withLatestFrom, withLatestFrom, wrap, zip, zip, zip, zip, zip, zip, zip, zip, zip, zip, zip, zip, zipArray, zipWith, zipWith, zipWith, zipWith
-
-
-
-
Field Detail
-
buffer
final ReplaySubject.ReplayBuffer<T> buffer
-
observers
final java.util.concurrent.atomic.AtomicReference<ReplaySubject.ReplayDisposable<T>[]> observers
-
EMPTY
static final ReplaySubject.ReplayDisposable[] EMPTY
-
TERMINATED
static final ReplaySubject.ReplayDisposable[] TERMINATED
-
done
boolean done
-
EMPTY_ARRAY
private static final java.lang.Object[] EMPTY_ARRAY
An empty array to avoid allocation in getValues().
-
-
Constructor Detail
-
ReplaySubject
ReplaySubject(ReplaySubject.ReplayBuffer<T> buffer)
Constructs a ReplayProcessor with the given custom ReplayBuffer instance.- Parameters:
buffer
- the ReplayBuffer instance, not null (not verified)
-
-
Method Detail
-
create
@CheckReturnValue @NonNull public static <T> @NonNull ReplaySubject<T> create()
Creates an unbounded replay subject.The internal buffer is backed by an
ArrayList
and starts with an initial capacity of 16. Once the number of items reaches this capacity, it will grow as necessary (usually by 50%). However, as the number of items grows, this causes frequent array reallocation and copying, and may hurt performance and latency. This can be avoided with thecreate(int)
overload which takes an initial capacity parameter and can be tuned to reduce the array reallocation frequency as needed.- Type Parameters:
T
- the type of items observed and emitted by the Subject- Returns:
- the created subject
-
create
@CheckReturnValue @NonNull public static <T> @NonNull ReplaySubject<T> create(int capacityHint)
Creates an unbounded replay subject with the specified initial buffer capacity.Use this method to avoid excessive array reallocation while the internal buffer grows to accommodate new items. For example, if you know that the buffer will hold 32k items, you can ask the
ReplaySubject
to preallocate its internal array with a capacity to hold that many items. Once the items start to arrive, the internal array won't need to grow, creating less garbage and no overhead due to frequent array-copying.- Type Parameters:
T
- the type of items observed and emitted by the Subject- Parameters:
capacityHint
- the initial buffer capacity- Returns:
- the created subject
- Throws:
java.lang.IllegalArgumentException
- ifcapacityHint
is non-positive
-
createWithSize
@CheckReturnValue @NonNull public static <T> @NonNull ReplaySubject<T> createWithSize(int maxSize)
Creates a size-bounded replay subject.In this setting, the
ReplaySubject
holds at mostsize
items in its internal buffer and discards the oldest item.When observers subscribe to a terminated
ReplaySubject
, they are guaranteed to see at mostsize
onNext
events followed by a termination event.If an observer subscribes while the
ReplaySubject
is active, it will observe all items in the buffer at that point in time and each item observed afterwards, even if the buffer evicts items due to the size constraint in the mean time. In other words, once an Observer subscribes, it will receive items without gaps in the sequence.- Type Parameters:
T
- the type of items observed and emitted by the Subject- Parameters:
maxSize
- the maximum number of buffered items- Returns:
- the created subject
- Throws:
java.lang.IllegalArgumentException
- ifmaxSize
is non-positive
-
createUnbounded
static <T> ReplaySubject<T> createUnbounded()
Creates an unbounded replay subject with the bounded-implementation for testing purposes.This variant behaves like the regular unbounded
ReplaySubject
created viacreate()
but uses the structures of the bounded-implementation. This is by no means intended for the replacement of the original, array-backed and unboundedReplaySubject
due to the additional overhead of the linked-list based internal buffer. The sole purpose is to allow testing and reasoning about the behavior of the bounded implementations without the interference of the eviction policies.- Type Parameters:
T
- the type of items observed and emitted by the Subject- Returns:
- the created subject
-
createWithTime
@CheckReturnValue @NonNull public static <T> @NonNull ReplaySubject<T> createWithTime(long maxAge, @NonNull @NonNull java.util.concurrent.TimeUnit unit, @NonNull @NonNull Scheduler scheduler)
Creates a time-bounded replay subject.In this setting, the
ReplaySubject
internally tags each observed item with a timestamp value supplied by theScheduler
and keeps only those whose age is less than the supplied time value converted to milliseconds. For example, an item arrives at T=0 and the max age is set to 5; at T>=5 this first item is then evicted by any subsequent item or termination event, leaving the buffer empty.Once the subject is terminated, observers subscribing to it will receive items that remained in the buffer after the terminal event, regardless of their age.
If an observer subscribes while the
ReplaySubject
is active, it will observe only those items from within the buffer that have an age less than the specified time, and each item observed thereafter, even if the buffer evicts items due to the time constraint in the mean time. In other words, once an observer subscribes, it observes items without gaps in the sequence except for any outdated items at the beginning of the sequence.Note that terminal notifications (
onError
andonComplete
) trigger eviction as well. For example, with a max age of 5, the first item is observed at T=0, then anonComplete
notification arrives at T=10. If an observer subscribes at T=11, it will find an emptyReplaySubject
with just anonComplete
notification.- Type Parameters:
T
- the type of items observed and emitted by the Subject- Parameters:
maxAge
- the maximum age of the contained itemsunit
- the time unit oftime
scheduler
- theScheduler
that provides the current time- Returns:
- the created subject
- Throws:
java.lang.NullPointerException
- ifunit
orscheduler
isnull
java.lang.IllegalArgumentException
- ifmaxAge
is non-positive
-
createWithTimeAndSize
@CheckReturnValue @NonNull public static <T> @NonNull ReplaySubject<T> createWithTimeAndSize(long maxAge, @NonNull @NonNull java.util.concurrent.TimeUnit unit, @NonNull @NonNull Scheduler scheduler, int maxSize)
Creates a time- and size-bounded replay subject.In this setting, the
ReplaySubject
internally tags each received item with a timestamp value supplied by theScheduler
and holds at mostsize
items in its internal buffer. It evicts items from the start of the buffer if their age becomes less-than or equal to the supplied age in milliseconds or the buffer reaches itssize
limit.When observers subscribe to a terminated
ReplaySubject
, they observe the items that remained in the buffer after the terminal notification, regardless of their age, but at mostsize
items.If an observer subscribes while the
ReplaySubject
is active, it will observe only those items from within the buffer that have age less than the specified time and each subsequent item, even if the buffer evicts items due to the time constraint in the mean time. In other words, once an observer subscribes, it observes items without gaps in the sequence except for the outdated items at the beginning of the sequence.Note that terminal notifications (
onError
andonComplete
) trigger eviction as well. For example, with a max age of 5, the first item is observed at T=0, then anonComplete
notification arrives at T=10. If an observer subscribes at T=11, it will find an emptyReplaySubject
with just anonComplete
notification.- Type Parameters:
T
- the type of items observed and emitted by the Subject- Parameters:
maxAge
- the maximum age of the contained itemsunit
- the time unit oftime
maxSize
- the maximum number of buffered itemsscheduler
- theScheduler
that provides the current time- Returns:
- the created subject
- Throws:
java.lang.NullPointerException
- ifunit
orscheduler
isnull
java.lang.IllegalArgumentException
- ifmaxAge
ormaxSize
is non-positive
-
subscribeActual
protected void subscribeActual(Observer<? super T> observer)
Description copied from class:Observable
Operator implementations (both source and intermediate) should implement this method that performs the necessary business logic and handles the incomingObserver
s.There is no need to call any of the plugin hooks on the current
Observable
instance or theObserver
; all hooks and basic safeguards have been applied byObservable.subscribe(Observer)
before this method gets called.- Specified by:
subscribeActual
in classObservable<T>
- Parameters:
observer
- the incomingObserver
, nevernull
-
onSubscribe
public void onSubscribe(Disposable d)
Description copied from interface:Observer
Provides theObserver
with the means of cancelling (disposing) the connection (channel) with theObservable
in both synchronous (from withinObserver.onNext(Object)
) and asynchronous manner.- Parameters:
d
- theDisposable
instance whoseDisposable.dispose()
can be called anytime to cancel the connection
-
onNext
public void onNext(T t)
Description copied from interface:Observer
Provides theObserver
with a new item to observe.The
Observable
may call this method 0 or more times.The
Observable
will not call this method again after it calls eitherObserver.onComplete()
orObserver.onError(java.lang.Throwable)
.- Parameters:
t
- the item emitted by the Observable
-
onError
public void onError(java.lang.Throwable t)
Description copied from interface:Observer
Notifies theObserver
that theObservable
has experienced an error condition.If the
Observable
calls this method, it will not thereafter callObserver.onNext(T)
orObserver.onComplete()
.- Parameters:
t
- the exception encountered by the Observable
-
onComplete
public void onComplete()
Description copied from interface:Observer
Notifies theObserver
that theObservable
has finished sending push-based notifications.The
Observable
will not call this method if it callsObserver.onError(java.lang.Throwable)
.
-
hasObservers
@CheckReturnValue public boolean hasObservers()
Description copied from class:Subject
Returns true if the subject has any Observers.The method is thread-safe.
- Specified by:
hasObservers
in classSubject<T>
- Returns:
- true if the subject has any Observers
-
observerCount
@CheckReturnValue int observerCount()
-
getThrowable
@Nullable @CheckReturnValue public @Nullable java.lang.Throwable getThrowable()
Description copied from class:Subject
Returns the error that caused the Subject to terminate or null if the Subject hasn't terminated yet.The method is thread-safe.
- Specified by:
getThrowable
in classSubject<T>
- Returns:
- the error that caused the Subject to terminate or null if the Subject hasn't terminated yet
-
getValue
@Nullable @CheckReturnValue public T getValue()
Returns a single value the Subject currently has or null if no such value exists.The method is thread-safe.
- Returns:
- a single value the Subject currently has or null if no such value exists
-
cleanupBuffer
public void cleanupBuffer()
Makes sure the item cached by the head node in a bounded ReplaySubject is released (as it is never part of a replay).By default, live bounded buffers will remember one item before the currently receivable one to ensure subscribers can always receive a continuous sequence of items. A terminated ReplaySubject automatically releases this inaccessible item.
The method must be called sequentially, similar to the standard
onXXX
methods.History: 2.1.11 - experimental
- Since:
- 2.2
-
getValues
@CheckReturnValue public java.lang.Object[] getValues()
Returns an Object array containing snapshot all values of the Subject.The method is thread-safe.
- Returns:
- the array containing the snapshot of all values of the Subject
-
getValues
@CheckReturnValue public T[] getValues(T[] array)
Returns a typed array containing a snapshot of all values of the Subject.The method follows the conventions of Collection.toArray by setting the array element after the last value to null (if the capacity permits).
The method is thread-safe.
- Parameters:
array
- the target array to copy values into if it fits- Returns:
- the given array if the values fit into it or a new array containing all values
-
hasComplete
@CheckReturnValue public boolean hasComplete()
Description copied from class:Subject
Returns true if the subject has reached a terminal state through a complete event.The method is thread-safe.
- Specified by:
hasComplete
in classSubject<T>
- Returns:
- true if the subject has reached a terminal state through a complete event
- See Also:
Subject.hasThrowable()
-
hasThrowable
@CheckReturnValue public boolean hasThrowable()
Description copied from class:Subject
Returns true if the subject has reached a terminal state through an error event.The method is thread-safe.
- Specified by:
hasThrowable
in classSubject<T>
- Returns:
- true if the subject has reached a terminal state through an error event
- See Also:
Subject.getThrowable()
,Subject.hasComplete()
-
hasValue
@CheckReturnValue public boolean hasValue()
Returns true if the subject has any value.The method is thread-safe.
- Returns:
- true if the subject has any value
-
size
@CheckReturnValue int size()
-
add
boolean add(ReplaySubject.ReplayDisposable<T> rs)
-
remove
void remove(ReplaySubject.ReplayDisposable<T> rs)
-
terminate
ReplaySubject.ReplayDisposable<T>[] terminate(java.lang.Object terminalValue)
-
-