RxJava原理分析

RxJava 的核心思想的理解?

​ 有一个起点和一个终点,从起点开始把我们的“事件”流向终点,只不过在流的过程中可以增加拦截,对“事件”进行改变,终点只关心它的上一个流程。

RxJava的核心:订阅流程、线程切换

源码基于 io.reactivex.rxjava2:rxjava:2.1.12;

首先看下正常的 RxJava 使用方法:

    Observable.create(new ObservableOnSubscribe<String>() {
   
        @Override
        public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
   
            emitter.onNext("A");
        }
    }).subscribe(new Observer<String>() {
   
        @Override
        public void onSubscribe(@NonNull Disposable d) {
   

        }

        @Override
        public void onNext(@NonNull String s) {
   
						// 这里可以收到 A
        }

        @Override
        public void onError(@NonNull Throwable e) {
   

        }

        @Override
        public void onComplete() {
   

        }
    });

然后我们先后从 Observer(订阅者,观察者),Observable(发布者,被观察者),subscribe(订阅)来看下具体的流程。

订阅流程

1. Observer 源码
public interface Observer<T> {
   

    /**
     * 为观察者提供以同步方式(从onNext(Object) )和异步方式取消(处置)与Observable的连接(通道)的方法。
     *
     * 参数:d –可随时调用其Disposable.dispose()的Disposable实例以取消连接
     * 自从:2.0
     */
    void onSubscribe(@NonNull Disposable d);

    /**
     * 为观察者提供一个新的观察对象。
     * Observable可以多次调用此方法。
     * Observable调用onComplete或onError之后,将不会再次调用此方法。
     *
     * 参数:t –可观察对象发射的项目
     */
    void onNext(@NonNull T t);

    /**
     * 通知观察者Observable发生错误情况。
     * 如果Observable调用此方法,则此后将不再调用onNext或onComplete 。
     */
    void onError(@NonNull Throwable e);

    /**
     * 通知观察者Observable已完成基于推送的通知的发送。
     * 如果Observable调用onError则它将不会调用此方法。
     */
    void onComplete();

}
2. Observable 创建过程

首先看下 Observable.create 的代码:

    @CheckReturnValue
    @SchedulerSupport(SchedulerSupport.NONE)
    public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
   
        ObjectHelper.requireNonNull(source, "source is null");
        return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
    }

ObservableCreate 中只是把自定义的 source 赋了个值,保存了一下:

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

    public ObservableCreate(ObservableOnSubscribe<T> source) {
   
        this.source = source;
    }
}

RxJavaPlugins.onAssembly 中什么都没做,很多操作符都会经过 onAssemly 的全局监听。传入什么就返回什么:

    /**
     * 调用关联的钩子函数。
     *
     * 参数:来源–挂钩的输入值
     * 类型参数:<T> –值类型
     * 返回值:钩子返回的值
     */
    @SuppressWarnings({
    "rawtypes", "unchecked" })
    @NonNull
    public static <T> Observable<T> onAssembly(@NonNull Observable<T> source) {
   
      	// f 默认都是 null
        Function<? super Observable, ? extends Observable> f = onObservableAssembly;
        if (f != null) {
   
            return apply(f, source);
        }
      	// 直接返回
        return source;
    }
3. subscribe 订阅过程

首先看下订阅的代码:

    @SchedulerSupport(SchedulerSupport.NONE)
    @Override
    public final void subscribe(Observer<? super T> observer) {
   
        ObjectHelper.requireNonNull(observer, "observer is null");
        try {
   
          	// 同上面 RxJavaPlugins.onAssembly 一样 原样返回
            observer = RxJavaPlugins.onSubscribe(this, observer);

            ObjectHelper.requireNonNull(observer, "Plugin returned null Observer");
						// 会跳到 ObservableCreate 的subscribeActual方法
            subscribeActual(observer);
        } catch (NullPointerException e) {
    // NOPMD
            throw e;
        } catch (Throwable e) {
   
           // 这里省略不相关的代码
            throw npe;
        }
    }

ObservableCreatesubscribeActual 的代码如下:

    @Override
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值