Class DisposableSubscriber<T>

java.lang.Object
io.reactivex.rxjava4.subscribers.DisposableSubscriber<T>
Type Parameters:
T - the received value type.
All Implemented Interfaces:
FlowableSubscriber<T>, Disposable, AutoCloseable, Flow.Subscriber<T>

public abstract class DisposableSubscriber<T> extends Object implements FlowableSubscriber<T>, Disposable
An abstract Subscriber that allows asynchronous, external cancellation by implementing Disposable.

All pre-implemented final methods are thread-safe.

The default #onStart() requests Long.MAX_VALUE by default. Override the method to request a custom positive amount. Use the protected #request(long) to request more items and #cancel() to cancel the sequence from within an onNext implementation.

Note that calling #request(long) from #onStart() may trigger an immediate, asynchronous emission of data to Flow.Subscriber.onNext(Object). Make sure all initialization happens before the call to request() in onStart(). Calling #request(long) inside Flow.Subscriber.onNext(Object) can happen at any time because by design, onNext calls from upstream are non-reentrant and non-overlapping.

Like all other consumers, DisposableSubscriber can be subscribed only once. Any subsequent attempt to subscribe it to a new source will yield an IllegalStateException with message "It is not allowed to subscribe with a(n) <class name> multiple times.".

Implementation of #onStart(), Flow.Subscriber.onNext(Object), Flow.Subscriber.onError(Throwable) and Flow.Subscriber.onComplete() are not allowed to throw any unchecked exceptions. If for some reason this can't be avoided, use Flowable.safeSubscribe(java.util.concurrent.Flow.Subscriber) instead of the standard subscribe() method.

Example

Disposable d =
    Flowable.range(1, 5)
    .subscribeWith(new DisposableSubscriber<Integer>() {
        @Override public void onStart() {
            request(1);
        }
        @Override public void onNext(Integer t) {
            if (t == 3) {
                cancel();
            }
            System.out.println(t);
            request(1);
        }
        @Override public void onError(Throwable t) {
            t.printStackTrace();
        }
        @Override public void onComplete() {
            System.out.println("Done!");
        }
    });
// ...
d.dispose();