T
- the type of items observed and emitted by the Subjectpublic final class ReplaySubject<T> extends Subject<T,T>
Observer
that subscribes.
Example usage:
ReplaySubject<Object> subject = ReplaySubject.create();
subject.onNext("one");
subject.onNext("two");
subject.onNext("three");
subject.onCompleted();
// both of the following will get the onNext/onCompleted calls from above
subject.subscribe(observer1);
subject.subscribe(observer2);
Observable.OnSubscribe<T>, Observable.Operator<R,T>, Observable.Transformer<T,R>
Modifier and Type | Method and Description |
---|---|
static <T> ReplaySubject<T> |
create()
Creates an unbounded replay subject.
|
static <T> ReplaySubject<T> |
create(int capacity)
Creates an unbounded replay subject with the specified initial buffer capacity.
|
static <T> ReplaySubject<T> |
createWithSize(int size)
Creates a size-bounded replay subject.
|
static <T> ReplaySubject<T> |
createWithTime(long time,
java.util.concurrent.TimeUnit unit,
Scheduler scheduler)
Creates a time-bounded replay subject.
|
static <T> ReplaySubject<T> |
createWithTimeAndSize(long time,
java.util.concurrent.TimeUnit unit,
int size,
Scheduler scheduler)
Creates a time- and size-bounded replay subject.
|
java.lang.Throwable |
getThrowable()
Returns the Throwable that terminated the Subject.
|
T |
getValue() |
java.lang.Object[] |
getValues()
Returns a snapshot of the currently buffered non-terminal events.
|
T[] |
getValues(T[] a)
Returns a snapshot of the currently buffered non-terminal events into
the provided
a array or creates a new array if it has not enough capacity. |
boolean |
hasAnyValue() |
boolean |
hasCompleted()
Check if the Subject has terminated normally.
|
boolean |
hasObservers()
|
boolean |
hasThrowable()
Check if the Subject has terminated with an exception.
|
boolean |
hasValue() |
void |
onCompleted()
Notifies the Observer that the
Observable has finished sending push-based notifications. |
void |
onError(java.lang.Throwable e)
Notifies the Observer that the
Observable has experienced an error condition. |
void |
onNext(T t)
Provides the Observer with a new item to observe.
|
int |
size()
Returns the current number of items (non-terminal events) available for replay.
|
toSerialized
all, amb, amb, amb, amb, amb, amb, amb, amb, amb, ambWith, asObservable, buffer, buffer, buffer, buffer, buffer, buffer, buffer, buffer, buffer, buffer, buffer, buffer, cache, cache, cacheWithInitialCapacity, cast, collect, combineLatest, combineLatest, combineLatest, combineLatest, combineLatest, combineLatest, combineLatest, combineLatest, combineLatest, combineLatest, combineLatestDelayError, compose, concat, concat, concat, concat, concat, concat, concat, concat, concat, concat, concatDelayError, concatDelayError, concatDelayError, concatDelayError, concatDelayError, concatDelayError, concatDelayError, concatDelayError, concatDelayError, concatDelayError, concatEager, concatEager, concatEager, concatEager, concatEager, concatEager, concatEager, concatEager, concatEager, concatEager, concatEager, concatEager, concatMap, concatMapDelayError, concatMapEager, concatMapEager, concatMapEager, concatMapIterable, concatWith, contains, count, countLong, create, create, create, create, debounce, debounce, debounce, defaultIfEmpty, defer, delay, delay, delay, delay, delaySubscription, delaySubscription, delaySubscription, delaySubscription, dematerialize, distinct, distinct, distinctUntilChanged, distinctUntilChanged, distinctUntilChanged, doAfterTerminate, doOnCompleted, doOnEach, doOnEach, doOnError, doOnNext, doOnRequest, doOnSubscribe, doOnTerminate, doOnUnsubscribe, elementAt, elementAtOrDefault, empty, error, exists, filter, finallyDo, first, first, firstOrDefault, firstOrDefault, flatMap, flatMap, flatMap, flatMap, flatMap, flatMap, flatMapCompletable, flatMapCompletable, flatMapCompletable, flatMapIterable, flatMapIterable, flatMapIterable, flatMapIterable, flatMapSingle, flatMapSingle, flatMapSingle, forEach, forEach, forEach, from, from, from, from, from, fromCallable, groupBy, groupBy, groupBy, groupBy, groupJoin, ignoreElements, interval, interval, interval, interval, isEmpty, join, just, just, just, just, just, just, just, just, just, just, last, last, lastOrDefault, lastOrDefault, lift, limit, map, materialize, merge, merge, merge, merge, merge, merge, merge, merge, merge, merge, merge, merge, merge, merge, mergeDelayError, mergeDelayError, mergeDelayError, mergeDelayError, mergeDelayError, mergeDelayError, mergeDelayError, mergeDelayError, mergeDelayError, mergeDelayError, mergeDelayError, mergeDelayError, mergeWith, nest, never, observeOn, observeOn, observeOn, observeOn, ofType, onBackpressureBuffer, onBackpressureBuffer, onBackpressureBuffer, onBackpressureBuffer, onBackpressureDrop, onBackpressureDrop, onBackpressureLatest, onErrorResumeNext, onErrorResumeNext, onErrorReturn, onExceptionResumeNext, onTerminateDetach, publish, publish, range, range, rebatchRequests, reduce, reduce, repeat, repeat, repeat, repeat, repeatWhen, repeatWhen, replay, replay, replay, replay, replay, replay, replay, replay, replay, replay, replay, replay, replay, replay, replay, replay, retry, retry, retry, retryWhen, retryWhen, sample, sample, sample, scan, scan, sequenceEqual, sequenceEqual, serialize, share, single, single, singleOrDefault, singleOrDefault, skip, skip, skip, skipLast, skipLast, skipLast, skipUntil, skipWhile, sorted, sorted, startWith, startWith, startWith, startWith, startWith, startWith, startWith, startWith, startWith, startWith, startWith, subscribe, subscribe, subscribe, subscribe, subscribe, subscribe, subscribeOn, subscribeOn, switchIfEmpty, switchMap, switchMapDelayError, switchOnNext, switchOnNextDelayError, take, take, take, takeFirst, takeLast, takeLast, takeLast, takeLast, takeLast, takeLastBuffer, takeLastBuffer, takeLastBuffer, takeLastBuffer, takeLastBuffer, takeUntil, takeUntil, takeWhile, test, test, throttleFirst, throttleFirst, throttleLast, throttleLast, throttleWithTimeout, throttleWithTimeout, timeInterval, timeInterval, timeout, timeout, timeout, timeout, timeout, timeout, timeout, timeout, timer, timer, timer, timer, timestamp, timestamp, to, toBlocking, toCompletable, toList, toMap, toMap, toMap, toMultimap, toMultimap, toMultimap, toMultimap, toSingle, toSortedList, toSortedList, toSortedList, toSortedList, unsafeCreate, unsafeSubscribe, unsubscribeOn, using, using, window, window, window, window, window, window, window, window, window, window, window, window, withLatestFrom, withLatestFrom, withLatestFrom, withLatestFrom, withLatestFrom, withLatestFrom, withLatestFrom, withLatestFrom, withLatestFrom, withLatestFrom, zip, zip, zip, zip, zip, zip, zip, zip, zip, zip, zip, zipWith, zipWith
public static <T> ReplaySubject<T> create()
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 the create(int)
overload which takes an initial capacity
parameter and can be tuned to reduce the array reallocation frequency as needed.
T
- the type of items observed and emitted by the Subjectpublic static <T> ReplaySubject<T> create(int 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.
T
- the type of items observed and emitted by the Subjectcapacity
- the initial buffer capacitypublic static <T> ReplaySubject<T> createWithSize(int size)
In this setting, the ReplaySubject
holds at most size
items in its internal buffer and
discards the oldest item.
When observers subscribe to a terminated ReplaySubject
, they are guaranteed to see at most
size
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.
T
- the type of items observed and emitted by the Subjectsize
- the maximum number of buffered itemspublic static <T> ReplaySubject<T> createWithTime(long time, java.util.concurrent.TimeUnit unit, Scheduler scheduler)
In this setting, the ReplaySubject
internally tags each observed item with a timestamp value
supplied by the Scheduler
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
and onCompleted
) trigger eviction as well. For
example, with a max age of 5, the first item is observed at T=0, then an onCompleted
notification
arrives at T=10. If an observer subscribes at T=11, it will find an empty ReplaySubject
with just
an onCompleted
notification.
T
- the type of items observed and emitted by the Subjecttime
- the maximum age of the contained itemsunit
- the time unit of time
scheduler
- the Scheduler
that provides the current timepublic static <T> ReplaySubject<T> createWithTimeAndSize(long time, java.util.concurrent.TimeUnit unit, int size, Scheduler scheduler)
In this setting, the ReplaySubject
internally tags each received item with a timestamp value
supplied by the Scheduler
and holds at most size
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 its size
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 most size
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
and onCompleted
) trigger eviction as well. For
example, with a max age of 5, the first item is observed at T=0, then an onCompleted
notification
arrives at T=10. If an observer subscribes at T=11, it will find an empty ReplaySubject
with just
an onCompleted
notification.
T
- the type of items observed and emitted by the Subjecttime
- the maximum age of the contained itemsunit
- the time unit of time
size
- the maximum number of buffered itemsscheduler
- the Scheduler
that provides the current timepublic void onNext(T t)
Observer
The Observable
may call this method 0 or more times.
The Observable
will not call this method again after it calls either Observer.onCompleted()
or
Observer.onError(java.lang.Throwable)
.
t
- the item emitted by the Observablepublic void onError(java.lang.Throwable e)
Observer
Observable
has experienced an error condition.
If the Observable
calls this method, it will not thereafter call Observer.onNext(T)
or
Observer.onCompleted()
.
e
- the exception encountered by the Observablepublic void onCompleted()
Observer
Observable
has finished sending push-based notifications.
The Observable
will not call this method if it calls Observer.onError(java.lang.Throwable)
.
public boolean hasObservers()
Subject
hasObservers
in class Subject<T,T>
public boolean hasThrowable()
onError
.public boolean hasCompleted()
onCompleted
public java.lang.Throwable getThrowable()
null
if the
subject hasn't terminated yet or it terminated normally.public int size()
public boolean hasAnyValue()
public boolean hasValue()
public T[] getValues(T[] a)
a
array or creates a new array if it has not enough capacity.a
- the array to fill ina
if it had enough capacity or a new array containing the available valuespublic java.lang.Object[] getValues()
The operation is thread-safe.
public T getValue()