When an Observer is subscribed to an ObservableSource through the ObservableSource#subscribe(Observer) method,
the ObservableSource calls onSubscribe(Disposable) with a Disposable that allows
disposing the sequence at any time, then the
ObservableSource may call the Observer's onNext method any number of times
to provide notifications. A well-behaved
ObservableSource will call an Observer's onComplete method exactly once or the Observer's
onError method exactly once.
Calling the Observer's method must happen in a serialized fashion, that is, they must not
be invoked concurrently by multiple threads in an overlapping fashion and the invocation pattern must
adhere to the following protocol:
onSubscribe onNext* (onError | onComplete)?
Subscribing an Observer to multiple ObservableSources is not recommended. If such reuse
happens, it is the duty of the Observer implementation to be ready to receive multiple calls to
its methods and ensure proper concurrent behavior of its business logic.
Calling onSubscribe(Disposable), onNext(Object) or onError(Throwable) with a
null argument is forbidden.
The implementations of the onXXX methods should avoid throwing runtime exceptions other than the following cases
(see Rule 2.13 of the Reactive Streams specification):
null, the methods can throw a NullPointerException.
Note though that RxJava prevents nulls to enter into the flow and thus there is generally no
need to check for nulls in flows assembled from standard sources and intermediate operators.
VirtualMachineError).Violating Rule 2.13 results in undefined flow behavior. Generally, the following can happen:
onError call.ObservableSource#subscribe(Observer) throws instead of returning normally.Scheduler or java.util.concurrent.Executor )
providing the asynchronous boundary the code is running and either routes the exception to the global
io.reactivex.rxjava3.plugins.RxJavaPlugins#onError(Throwable) handler or the current thread's
java.lang.Thread.UncaughtExceptionHandler#uncaughtException(Thread, Throwable) handler.Observable's perspective, an Observer is the end consumer thus it is the Observer's
responsibility to handle the error case and signal it "further down". This means unreliable code in the onXXX
methods should be wrapped into `try-catch`es, specifically in onError(Throwable) or onComplete(), and handled there
(for example, by logging it or presenting the user with an error dialog). However, if the error would be thrown from
onNext(Object), Rule 2.13 mandates
the implementation calls Disposable#dispose() and signals the exception in a way that is adequate to the target context,
for example, by calling onError(Throwable) on the same Observer instance.
If, for some reason, the Observer won't follow Rule 2.13, the Observable#safeSubscribe(Observer) can wrap it
with the necessary safeguards and route exceptions thrown from onNext into onError and route exceptions thrown
from onError and onComplete into the global error handler via io..
| Modifier and Type | Method and Description |
|---|---|
| public void | onComplete()
Notifies the |
| public void | onError(@NonNull Throwable
the exception encountered by the Observable e)Notifies the |
| public void | |
| public void | onSubscribe(@NonNull Disposable
the d)Disposable instance whose Disposable#dispose() can
be called anytime to cancel the connectionProvides the |
| onComplete | back to summary |
|---|---|
| public void onComplete() Notifies the
The | |
| onError | back to summary |
|---|---|
| public void onError(@NonNull Throwable e) Notifies the
If the | |
| onNext | back to summary |
|---|---|
| public void onNext(T t) Provides the
The
The
| |
| onSubscribe | back to summary |
|---|---|
| public void onSubscribe(@NonNull Disposable d) Provides the
| |