Package rx.observers

Class SafeSubscriber<T>

  • Type Parameters:
    T - the type of item expected by the Subscriber
    All Implemented Interfaces:
    Observer<T>, Subscription

    public class SafeSubscriber<T>
    extends Subscriber<T>
    SafeSubscriber is a wrapper around Subscriber that ensures that the Subscriber complies with the Observable contract.

    The following is taken from the Rx Design Guidelines document:

    Messages sent to instances of the IObserver interface follow the following grammar:

    OnNext* (OnCompleted | OnError)?

    This grammar allows observable sequences to send any amount (0 or more) of OnNext messages to the subscriber, optionally followed by a single success (OnCompleted) or failure (OnError) message.

    The single message indicating that an observable sequence has finished ensures that consumers of the observable sequence can deterministically establish that it is safe to perform cleanup operations.

    A single failure further ensures that abort semantics can be maintained for operators that work on multiple observable sequences (see paragraph 6.6).

    This wrapper does the following:

    • Allows only single execution of either onError or onCompleted.
    • Ensures that once an onCompleted or onError is performed, no further calls can be executed
    • If unsubscribe is called, the upstream Observable is notified and the event delivery will be stopped in a best effort manner (i.e., further onXXX calls may still slip through).
    • When onError or onCompleted occur, unsubscribes from the Observable (if executing asynchronously).
    SafeSubscriber will not synchronize onNext execution. Use SerializedSubscriber to do that.
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private Subscriber<? super T> actual  
      (package private) boolean done  
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      protected void _onError​(java.lang.Throwable e)
      The logic for onError without the isFinished check so it can be called from within onCompleted.
      Subscriber<? super T> getActual()
      Returns the Subscriber underlying this SafeSubscriber.
      void onCompleted()
      Notifies the Subscriber that the Observable has finished sending push-based notifications.
      void onError​(java.lang.Throwable e)
      Notifies the Subscriber that the Observable has experienced an error condition.
      void onNext​(T args)
      Provides the Subscriber with a new item to observe.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • done

        boolean done
    • Constructor Detail

      • SafeSubscriber

        public SafeSubscriber​(Subscriber<? super T> actual)
    • Method Detail

      • onCompleted

        public void onCompleted()
        Notifies the Subscriber that the Observable has finished sending push-based notifications.

        The Observable will not call this method if it calls onError(java.lang.Throwable).

      • onError

        public void onError​(java.lang.Throwable e)
        Notifies the Subscriber that the Observable has experienced an error condition.

        If the Observable calls this method, it will not thereafter call onNext(T) or onCompleted().

        Parameters:
        e - the exception encountered by the Observable
      • onNext

        public void onNext​(T args)
        Provides the Subscriber 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 either onCompleted() or onError(java.lang.Throwable).

        Parameters:
        args - the item emitted by the Observable
      • _onError

        protected void _onError​(java.lang.Throwable e)
        The logic for onError without the isFinished check so it can be called from within onCompleted.
        See Also:
        the report of this bug
      • getActual

        public Subscriber<? super T> getActual()
        Returns the Subscriber underlying this SafeSubscriber.
        Returns:
        the Subscriber that was used to create this SafeSubscriber