Rxjava 初始源码探究

来源:互联网 发布:三菱fx5u编程手册 编辑:程序博客网 时间:2024/06/14 23:33

Observable 的创建 是用链式的工厂模式创建的 Observable.create

public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {        ObjectHelper.requireNonNull(source, "source is null");  //这个是判断参数是否为空, 未空的时候会抛出异常 ,“source is null”        return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));    }

rxjava2.0的创建代码传入的接口改了。 这个主要代码逻辑在返回值哪里里
首先看ObservableCreate(source) ObservableCreate 是继承于Observable 的一个final 类 这里创建了该类,把传入接口的实现类作为参数传入去。
接下来的RxJavaPlugins 类他的说明是这么写的:Utility class(工具类) to inject注入 handlers 操作 to certain standard(某个标准) RxJava operations运营. 这个一个用于注入某个Rxjava运作标准操作的工作类 。
onAssembly

    /**     * Calls the associated(关联) hook function.  //调用相关的hook函数     * @param <T> the value type     * @param source the hook's input value     * @return the value returned by the hook     */    @SuppressWarnings({ "rawtypes", "unchecked" })   //对于某些警告保持沉默    public static <T> Observable<T> onAssembly(Observable<T> source) {        Function<Observable, Observable> f = onObservableAssembly;  //默认应该是null        if (f != null) {            return apply(f, source);        }        return source;    }

首先看到它返回的是一个observable 的类型的参数 形参是上转型过程
所以用create’方法创建的是一个流程为:
先实例化一个ObservableOnSubscribe的接口的类然后吧这个类 封装上转型到成Observable 类。接下里的问题是,新建的ObservableOnSubscribe接口的subscribe 方法在哪里调用 ,首先在子类的方法里寻找因为这个是上转型的产物。可以在这个方法里找到`

 @Override    protected void subscribeActual(Observer<? super T> observer) {        CreateEmitter<T> parent = new CreateEmitter<T>(observer);        observer.onSubscribe(parent);        try {            source.subscribe(parent);   //这里调用了实现接口的subscribe方法        } catch (Throwable ex) {            Exceptions.throwIfFatal(ex);            parent.onError(ex);        }    }

这个方法找在哪里调用? 从父类的方里面找:

 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);  //这里调用了子类的subscribeActual方法,        } 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;        }    }

果不其然在subscrible 里面找到了这个方法的调用,他在observable里面仅仅是个抽象方法,具体实现在子类的ObservableCreate里面

所以这个Obserrvable的创建流程是:
1. 用工厂模式创建一个Observable的子类ObservableCreate ,该子类实现了Observable的抽象方法
2. 创建子类ObservableCreate 的时候调用构造方法传入ObservableOnSubscribe 接口的实现类作为变量存储在ObservableCreate里面,在实现父类的抽象方法中调用该接口的方法
3. 这个时候Observable的子类ObservableCreate已经创建配置完毕,在用上转型 强制转换成observable。
4. 当你运用Observable.subscirbe 连接observer的时候 调用了子类的subscribeActual 并且吧observer作为形参传入,在然后在子类的subscribeActual 中调用了接口的subscribe方法并传入observer,这个方法我们已经重写了在创建observable的时候,这样就实现了总体的回调机制

原创粉丝点击