RxJava(1)基本的架构

308 阅读1分钟

Rxjava称之为响应式编程,也称之为<异步事件流编程>.

结构图

1,创建ObservableJust对象,该类继承自抽象类Observable。

@CheckReturnValue
@SchedulerSupport(SchedulerSupport.NONE)
public static <T> Observable<T> just(T item) {
   ObjectHelper.requireNonNull(item, "The item is null");
   return RxJavaPlugins.onAssembly(new ObservableJust<T>(item));
}

2,该类实现Observable的抽象方法subscribeActual。

public final class ObservableJust<T> extends Observable<T> implements ScalarCallable<T> {

   private final T value;
   public ObservableJust(final T value) {
       this.value = value;
   }

   @Override
   protected void subscribeActual(Observer<? super T> s) {
       ScalarDisposable<T> sd = new ScalarDisposable<T>(s, value);
       s.onSubscribe(sd);
       sd.run();
   }

   @Override
   public T call() {
       return value;
   }
}

3,当给observable添加观察者的时候,会调用subscribeActual方法。该方法在第2步的时候进行的实例化。并将观察者对象传入进去。

  @SchedulerSupport(SchedulerSupport.NONE)
   @Override
   public final void subscribe(Observer<? super T> observer) {
       ObjectHelper.requireNonNull(observer, "observer is null");
       try {
           observer = RxJavaPlugins.onSubscribe(this, observer);

           ObjectHelper.requireNonNull(observer, "Plugin returned null Observer");

           subscribeActual(observer);
       } catch (NullPointerException e) { // NOPMD
           throw e;
       } catch (Throwable e) {
           Exceptions.throwIfFatal(e);
           // can't call onError because no way to know if a Disposable has been set or not
           // can't call onSubscribe because the call might have set a Subscription already
           RxJavaPlugins.onError(e);

           NullPointerException npe = new NullPointerException("Actually not, but can't throw other exceptions due to RS");
           npe.initCause(e);
           throw npe;
       }
   }

4,调用观察者的onSubscribe方法,将ScalarDisposable对象传过去。该类是观察者的一个代理类,然后调用该类的run方法。在run方法中调用了onNext和onComplete方法。

具体流程图如下

在多个事件中,是把最初的事件对象observable进行包装代理处理。