RxJava源码阅读(一)

该博客围绕Java中观察者模式展开,介绍了基本写法,包括创建被观察者和观察者,以及发起订阅的方法。详细解释了发起订阅后回调观察者方法的原理,还提及结束订阅的方法。最后总结了相关调用流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.基本写法

Observable.just("测试")
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String str) throws Exception {
                        System.out.println(str);
                    }
                });
复制代码
  • 1.1 Observable.just()方法创建一个被观察者
  • 1.2 被观察者通过subscribe方法订阅观察者。
  • 1.2 被观察者订阅观察者后马上回调观察者的accept方法

2.创建被观察者

public static <T> Observable<T> just(T item) {
        ObjectHelper.requireNonNull(item, "The item is null");
        return RxJavaPlugins.onAssembly(new ObservableJust<T>(item));
}
复制代码
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;
}
复制代码

这里被观察者其实就是new ObservableJust<T>(item)

3.创建观察者

这里的观察者就是一个接口,只有一个accept方法。被观察者发起订阅后,观察者会回调accept方法,将被观察者发送的数据拿到

4.发起订阅

被观察者通过subscribe方法订阅观察者

public final Disposable subscribe(Consumer<? super T> onNext) {
        return subscribe(onNext, Functions.ON_ERROR_MISSING, Functions.EMPTY_ACTION, Functions.emptyConsumer());
}
复制代码
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError,
            Action onComplete, Consumer<? super Disposable> onSubscribe) {
        ObjectHelper.requireNonNull(onNext, "onNext is null");
        ObjectHelper.requireNonNull(onError, "onError is null");
        ObjectHelper.requireNonNull(onComplete, "onComplete is null");
        ObjectHelper.requireNonNull(onSubscribe, "onSubscribe is null");

        LambdaObserver<T> ls = new LambdaObserver<T>(onNext, onError, onComplete, onSubscribe);

        subscribe(ls);

        return ls;
}
复制代码
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;
        }
}
复制代码

最终调用抽象方法

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

也就是Observable子类ObservableJust调用了这个方法,参数是LambdaObserver<T> ls = new LambdaObserver<T>(onNext, onError, onComplete, onSubscribe);ls

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

订阅方法最终执行了LambdaObserveronSubscribe方法和ScalarDisposablerun方法

4.1LambdaObserveronSubscribe方法

public void onSubscribe(Disposable s) {
        if (DisposableHelper.setOnce(this, s)) {
            try {
                onSubscribe.accept(this);
            } catch (Throwable ex) {
                Exceptions.throwIfFatal(ex);
                s.dispose();
                onError(ex);
            }
        }
}
复制代码

这里解释了为什么发起订阅后就会回调观察者的accept方法

4.2ScalarDisposablerun方法

public void run() {
        if (get() == START && compareAndSet(START, ON_NEXT)) {
            observer.onNext(value);
            if (get() == ON_NEXT) {
                lazySet(ON_COMPLETE);
                observer.onComplete();
            }
        }
}
复制代码

直接结束此次订阅

5.总结

  • Observable.just("测试") --> new ObservableJust("测试")
  • Observable.just("测试").subscribe(new Consumer()); -->
new ObservableJust<T>("测试").subscribeActual(new LambdaObserver<T>(new Consumer<String>(), onError, onComplete, onSubscribe))
复制代码

最终调用LambdaObserver中onSubscribe方法 --> ScalarDisposable中run方法 onSubscribe.accept(this); --> observer.onNext(value); observer.onComplete();

转载于:https://juejin.im/post/5cde514551882525ef3f99bb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值