Rxjava2源码分析一Create方法

首先从一段代码开始复制代码
Observable.create(new ObservableOnSubscribe<Integer>() {
                 @Override
                 public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                     emitter.onNext(1);
                     emitter.onComplete()
                 }
             }).subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        
                    }

                    @Override
                    public void onNext(Integer integer) {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });;复制代码

 进入看Observable.creat方法

public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
                             ObjectHelper.requireNonNull(source, "source is null");
                             return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
                         }复制代码

这里生成了一个ObservableCreate<T>(source)了继续看下继续看RxJavaPlugins.onAssembly方法

public static <T> Observable<T> onAssembly(@NonNull Observable<T> source) {
             Function<? super Observable, ? extends Observable> f = onObservableAssembly;
             if (f != null) {
                 return apply(f, source);
             }
             return source;
         }复制代码

接下来看下onObservableAssembly

static volatile Function<? super Observable, ? extends Observable> onObservableAssembly;
            public static void setOnObservableAssembly(@Nullable Function<? super Observable, ? extends Observable> onObservableAssembly) {
                  if (lockdown) {
                      throw new IllegalStateException("Plugins can't be changed anymore");
                  }
                  RxJavaPlugins.onObservableAssembly = onObservableAssembly;
              }复制代码

因为setOnObservableAssembly()方法只有在rxJavaPlugins的reset()方法里面设置为null为没有其他设置,所以这个方法就是返回source参数ObservableCreate对象。

以上知道create方法就是生成了一个 ObservableCreate对象现在create方法看完了。接下来看subscribe()方法

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

                 ObjectHelper.requireNonNull(observer, "The RxJavaPlugins.onSubscribe hook returned a null Observer. Please change the handler provided to RxJavaPlugins.setOnObservableSubscribe for invalid null returns. Further reading: https://github.com/ReactiveX/RxJava/wiki/Plugins");

                 subscribeActual(observer);                              2
             } 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;
             }
             }复制代码

  1处是把observer返回 接下来看2处

protected abstract void subscribeActual(Observer<? super T> observer);复制代码

这是抽象方法,子类是刚刚的create()方法的创建的ObservableCreate类 接下来看下这类的subscribeActual方法

protected void subscribeActual(Observer<? super T> observer) {
               CreateEmitter<T> parent = new CreateEmitter<T>(observer);1
                  observer.onSubscribe(parent);2
              
                      try {
                          source.subscribe(parent);3
                      } catch (Throwable ex) {
                          Exceptions.throwIfFatal(ex);
                          parent.onError(ex);
                      }
                                  }复制代码

首先1处创建了一个CreateEmitter 在rxjava中每个方法几乎都会创建自己的Emitter对象接下来看看这类的声明

static final class CreateEmitter<T>
                extends AtomicReference<Disposable>
                implements ObservableEmitter<T>, Disposable {}复制代码

这个类是ObservableEmitter的子类 接下来执行2 即observer的onSubscribe()方法                接下来3 在下面可知source是ObservableOnSubscribe对象


public final class ObservableCreate<T> extends Observable<T> {
    final ObservableOnSubscribe<T> source;

    public ObservableCreate(ObservableOnSubscribe<T> source) {
        this.source = source;
        }
}
复制代码

 在最上面一段代码中可以看到,我们在Create()方法参数的subscribe()回调中调用了emitter.onNext(1)  emitter.onComplete()方法

接下来看下CreateEmitter的onNext方法

 @Override
        public void onNext(T t) {
            if (t == null) {
                onError(new NullPointerException("onNext called with null. Null values are generally not allowed in 2.x operators and sources."));
                return;
            }
            if (!isDisposed()) {
                observer.onNext(t);
            }
        }复制代码

在这方法中,直接调用了Observer 的onNext方法。

这样一套Create() 和 Subscribe()方法的流程就走完了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值