RxJava<一> rxJava初览

本文深入探讨RxJava的内部机制,从入口方法subscribe开始,解析Observable如何通过Scheduler进行线程调度,最终传递到Observer。详细分析了RxJava的抽象化设计,以及其与Retrofit、Okhttp等框架的集成方式。

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

首先看下RxJava的入口。由于RxJava 实际上是Observable 的层层构造,中间也设置了Scheduler。下面这个方法是设置Observer的,实际分析RxJava 从此落脚分析是不错的。大家看RxJava 如何高度抽象化,利用Scheduler,调度,层层传递到Observer 的。调度实际主要是线程调度。

public final void subscribe(Observer<? super T> observer) {
    ObjectHelper.requireNonNull(observer, "observer is null");
    try {
        //Calls the associated hook function.  实际是调用Hook function的。
        observer = RxJavaPlugins.onSubscribe(this, observer);
        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");
        //这个接口方法实际上调用的包括在外层的Observalbe 的。一般情况下。通过 Observalbe  的各种Operator 之后生成形形色色的 Observalbe,现在跟进去如何关联Scheduler。此为抽象类。实际上最后的Observable只有subscribeOn 里面形成的 ObservableSubscribeOn,这个是上游的调度。形成的结果会层层调度到
        observeOn 形成的ObservableObserveOn 。最后传递到Observe里面去。 等于说各种操作符其实是对应的RxJava的调用逻辑。subscribeOn 虽然传入的是一个Scheduler,比如IoScheduler,但是返回的还是Observable。
        observeOn也是如此。IoScheduler 是采用线程池做的调度。observeOn 的Scheduler,比如说是 new HandlerScheduler(new Handler(Looper.getMainLooper()), false) ,采用的主线程的Looper,自然是通过Handler,把Runable,传递到主线程,最后传递给Observe的apply方法。
        以上这段只是一部分核心,但是确提供了RxJava的学习思路。结合我上面几篇的Retrofit,Retrofit 最后的落脚点就是生成了两种同步或者异步的Obseravle。比如CallExecuteObservable 和 CallEnqueueObservable。本来Okhttp就是采用线程池技术,Retrofit对他进行了改造了,线程池由外部的Scheduler提供。并且RxJava 还能实现类似Event Bus技术,实在是很牛逼的。        
        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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值