RxJava源码(从 just 开始)

RxJava源码(从 just 开始)

RxJava源码(简单操作符)

RxJava源码(线程)

RxJava源码(背压)

RxJava源码(RxBinding)

RxJava源码(衍生 RxLifecycle)

RxJava github地址:https://github.com/ReactiveX/RxJava/tree/2.x

RxJava相关概念和一些用法这里不再赘述,可以查看官方文档 官方文档 以及其他的一些博客,闲话少说,这里直接从 Rx 的 github 中简单用法去深入源码解读。

直接上代码,这里用 Flowable 的 just 操作符将 String 对象 “Hello world” 打印出来。

        val subscribe = Flowable.just("Hello world").subscribe(System.out::println)

直接跟进 Flowable.just()

    @CheckReturnValue
    @NonNull
    @BackpressureSupport(BackpressureKind.FULL)
    @SchedulerSupport(SchedulerSupport.NONE)
    public static <T> Flowable<T> just(T item) {
        ObjectHelper.requireNonNull(item, "item is null");
        return RxJavaPlugins.onAssembly(new FlowableJust<T>(item));
    }

ObjectHelper 的 requireNonNull 方法简单的做了 null 判断。

    public static <T> Flowable<T> onAssembly(@NonNull Flowable<T> source) {
        Function<? super Flowable, ? extends Flowable> f = onFlowableAssembly;
        if (f != null) {
            return apply(f, source);
        }
        return source;
    }

紧接着创建了一个 FlowableJust 对象,将我们的 item 传入 FlowableJust 对象中。

public final class FlowableJust<T> extends Flowable<T> 
    private final T value;
    public FlowableJust(final T value) {
        this.value = value;
    }
}

FlowableJust 继承了 Flowable,构造函数也很简单,简单赋值给成员变量 value。

进入 onAssembly 方法中,第一行的 onFlowableAssembly 是什么呢?我们先来暂停下。

    static volatile Function<? super Flowable, ? extends Flowable> onFlowableAssembly;

//onFlowableAssembly是Function接口的实例对象

public interface Function<T, R> {
   
    R apply(@NonNull T t) throws Exception;
}

先来介绍它的用法

        try {
            RxJavaPlugins.setOnFlowableAssembly(object : Function<Flowable<*>?, Flowable<*>?> {

                override fun apply(t: Flowable<*>): Flowable<*>? {
                 
                    return FlowableJust("Hello world 01")
                }
            })
            Flowable.just("Hello world 02").subscribe(System.out::println)
        } finally {
            RxJavaPlugins.reset()
        }

这段代码首先调用 RxJavaPlugins 的静态方法 setOnFlowableAssembly,设置 onFlowableAssembly 为我们创建出来的 FlowableJust("Hello world 01"),之后创建新的 Flowable 数据流。这段代码会输出什么呢?两个hello world会同时输出吗?

答案是只会输出 Hello world 01。跟进代码查看下为什么。

    static volatile Function<? super Flowable, ? extends Flowable> onFlowableAssembly;

    public static void setOnFlowableAssembly(@Nullable Function<? super Flowable, ? extends Flowable> onFlowableAssembly) {
        if (lockdown) {
            throw new IllegalStateException("Plugins can't be changed anymore");
        }
        RxJavaPlugins.onFlowableAssembly = onFlowableAssembly;
    }

将传入来的 Function 对象赋给 onFlowableAssembly 对象。

好了,接下来回到 onAssembly 方法中,这边有个 apply,上文提到了这个接口了。这边将FlowableJust("Hello world 01") 赋值给 onFlowableAssembly。

    static <T, R> R apply(@NonNull Function<T, R> f, @NonNull T t) {
        try {
            return f.apply(t);
        } catch (Throwable ex) {
            throw ExceptionHelper.wrapOrThrow(ex);
        }
    }

好吧,以后在走到这个方法都会被替换掉的,输出 Hello world 01。所以用完此方法必须 reset,不过这种方法也不常用。源码中有很多这种钩子,以后就不再分析了。

由此得出 just 方法返回的是 RxJava 内部创建的 FlowableJust 对象,其中 value 对象就是 Hello world。

这边数据源准备完成了,那么数据在什么时候发射的呢?接下来看下 subscribe 源码

    @CheckReturnValue
    @BackpressureSupport(BackpressureKind.UNBOUNDED_IN)
    @SchedulerSupport(SchedulerSupport.NONE)
    public final Disposable subscribe(Consumer<? super T> onNext) {
        return subscribe(onNext, Functions.ON_ERROR_MISSING,
                Functions.EMPTY_ACTION, FlowableInternalHelper.RequestMax.INSTANCE);
    }

subscribe 需要传入一个回调接口 Consumer,调用 accept 方法传值。

public interface Consumer<T> {

    void accept(T t) throws Exception;
}

这边创建了三个默认的值以便后续传参。onError 和 onComplete 不多解释了,大家应该都知道。onSubscribe 之后用到时会详细解释。

    //onError
    public static final Consumer<Throwable> ON_ERROR_MISSING = new OnErrorMissingConsumer();

    //onComplete
    public static final Action EMPTY_ACTION = new EmptyAction();
    
    //onSubscribe
    public enum RequestMax implements Consumer<Subscription> {
        INSTANCE;
        @Override
        public void accept(Subscription t) throws Exception {
            t.request(Long.MAX_VALUE);
        }
    }

进入 subscribe 方法中

    public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError,
            Action onComplete, Consumer<? super Subscription> 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");

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

        subscribe(ls);

        return ls;
    }

将四个参数封装成 LambdaSubscriber 对象,其中也是简单赋值,这里不贴代码了。重点看下 LambdaSubscriber 实现了哪些接口

public final class LambdaSubscriber<T> extends AtomicReference<Subscription>
        implements FlowableSubscriber<T>, Subscription, Disposable, LambdaConsumerIntrospection 

LambdaSubscriber 继承 AtomicReference,AtomicReference 类提供了一个可以原子读写的对象引用变量。 原子意味着尝试更改相同。get() 方法可获取引用,后续 ScalarSubscription 会与之关联。

FlowableSubscriber 继承自 Subscriber,是订阅者需要实现的接口。

  •         public void onSubscribe(Subscription s); Publisher.subscriber(Subscriber)之后调用。

  •         public void onNext(T t); 媒体发出来的数据通知。会继续

  •         public void onError(Throwable t); 媒体发出来的错误通知。不会继续

  •         public void onComplete(); 媒体发出来的完成通知。不会继续。

Subscription 管理 Publisher 和 Subscriber 一对一生命周期的接口。

  •        public void request(long n); 通过此方法发出请求信号,媒体不会发出任何事件。
  •        public void cancel();请求媒体停止发送数据,并清理资源。

Disposable 对事件流的处理

  • void dispose();用来中断事件流
  • boolean isDisposed();判断事件流是否中断。

因此 LambdaSubscriber 可以理解为 Subscriber。

    @BackpressureSupport(BackpressureKind.SPECIAL)
    @SchedulerSupport(SchedulerSupport.NONE)
    public final void subscribe(FlowableSubscriber<? super T> s) {
        ObjectHelper.requireNonNull(s, "s is null");
        try {
            Subscriber<? super T> z = RxJavaPlugins.onSubscribe(this, s);

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

            subscribeActual(z);
        } catch (NullPointerException e) { // NOPMD
            throw e;
        } catch (Throwable e) {
            Exceptions.throwIfFatal(e);
          
            RxJavaPlugins.onError(e);

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

首先 RxJavaPlugins.onSubscribe(this, s);

    public static <T> Subscriber<? super T> onSubscribe(@NonNull Flowable<T> source, @NonNull Subscriber<? super T> subscriber) {
        BiFunction<? super Flowable, ? super Subscriber, ? extends Subscriber> f = onFlowableSubscribe;
        if (f != null) {
            return apply(f, source, subscriber);
        }
        return subscriber;
    }

 与 onFlowableAssembly 类似呀,onFlowableSubscribe 是个 BiFunction 接口实例,这边比用管了,它的返回值 z 也就是传入的 s。(默认不设置 onFlowableSubscribe)

public interface BiFunction<T1, T2, R> {

    @NonNull
    R apply(@NonNull T1 t1, @NonNull T2 t2) throws Exception;
}

 下一步到 subscribeActual 方法 

    protected abstract void subscribeActual(Subscriber<? super T> s);

它是个抽象方法 ,自然去子类查找,子类当然是 FlowableJust 了。FlowableJust 的 subscribeActual。

    @Override
    protected void subscribeActual(Subscriber<? super T> s) {
        s.onSubscribe(new ScalarSubscription<T>(s, value));
    }

这里 new 了一个 ScalarSubscription 对象,重点注意此对象实现了 QueueSubscription 接口,QueueSubscription 的父类是 Subscription。将我们的 "Hello world" 的 value 和实现多个接口的 LambdaSubscriber 传入 ScalarSubscription 对象。

    @Override
    public void onSubscribe(Subscription s) {
        if (SubscriptionHelper.setOnce(this, s)) {
            try {
                onSubscribe.accept(this);
            } catch (Throwable ex) {
                Exceptions.throwIfFatal(ex);
                s.cancel();
                onError(ex);
            }
        }
    }

setOnce 方法

    public static boolean setOnce(AtomicReference<Subscription> field, Subscription s) {
        ObjectHelper.requireNonNull(s, "s is null");
        if (!field.compareAndSet(null, s)) {
            s.cancel();
            if (field.get() != CANCELLED) {
                reportSubscriptionSet();
            }
            return false;
        }
        return true;
    }

其中 compareAndSet 方法是,ScalarSubscription 与 null 进行比较,比较后 LambdaSubscriber 的 value 设置为 ScalarSubscription,所以 LambdaSubscriber 含有 ScalarSubscription 的引用。

onSubscribe 即创建的 RequestMax.INSTANCE 对象,构造函数中赋给 onSubscribe。调用 accept 方法,将 LambdaSubscriber 再传出去。

查看上文中初始化 RequestMax.INSTANCE 时贴出的代码,再次调用 LambdaSubscriber 的 request 方法,进入下面方法中。

    @Override
    public void request(long n) {
        get().request(n);
    }

    public final V get() {
        return value;
    }

get() 获取 ScalarSubscription 进入它的方法中

    @Override
    public void request(long n) {
        if (!SubscriptionHelper.validate(n)) {
            return;
        }
        if (compareAndSet(NO_REQUEST, REQUESTED)) {
            Subscriber<? super T> s = subscriber;

            s.onNext(value);
            if (get() != CANCELLED) {
                s.onComplete();
            }
        }

    }

此处 subscriber 和 s 即 LambdaSubscriber,又回到 LambdaSubscriber 中了

    @Override
    public void onNext(T t) {
        if (!isDisposed()) {
            try {
                onNext.accept(t);
            } catch (Throwable e) {
                Exceptions.throwIfFatal(e);
                get().cancel();
                onError(e);
            }
        }
    }

此处的t即为 "hello world",onNext 即为我们创建出来的 Consumer,这边再调用 System.out::println 处理。

流程详细的分析完成,其他的创建操作符也是相通的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值