rxjava学习笔记

自从看了仍物线写的<<给 Android 开发者的 RxJava 详解>>,觉得rxJava还是挺有意思的。它的主要两个功能是数据转换和线程切换,如果掌握好的话能给工作开发带来很大的效率提高(虽然我还没掌握好?)。既然是这么好的一个框架,而且还受到广大android开发者的一致好评,那么就有必要去看看它到底是一个什么东西,功能是怎么实现的。

本篇从源码的角度浅显的解释下发布者、订阅者和订阅过程中的数据流向。
先上一个简单的demo,如下:

		/**
         *订阅后,数据源一个一个的经过各个transformer传给订阅者
         */
        Flowable.range(1, 5)
                .map(new Function<Integer, Integer>() {
                    @Override
                    public Integer apply(Integer v) throws Throwable {
                        return v * v;
                    }
                }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Throwable {
                System.out.print(integer + ",");
            }
        });

函数的功能就是计算1-5的各个数的平方,运行结果:1,4,9,16,25,

下面进入源码看看依次生成的几个关键类:

public static Flowable<Integer> range(int start, int count) {
        ...//省略无关代码	
        return RxJavaPlugins.onAssembly(new FlowableRange(start, count));
    }
    
public final <R> Flowable<R> map(Function<? super T, ? extends R> mapper) {
        ObjectHelper.requireNonNull(mapper, "mapper is null");
        return RxJavaPlugins.onAssembly(new FlowableMap<T, R>(this, mapper));
    }

可以看到方法rang和map分别生成了FlowableRange和FlowableMap,RxJavaPlugins.onAssembly的作用一般就是返回传给它的参数,所以就是返回了FlowableRange和FlowableMap。其实FlowableRange和FlowableMap就是发布者

所有的发布者都是Flowable的子类,细心观察的话可以发现,FlowableRange作为初始的发布者,它存储了原始的数据;FlowableMap接收了个this参数,this实际就是他的上级Flowable(这里指FlowableRange),也就是说下一级发布者引用了它的上一级发布者。

发布者有很多类型,比如Flowable、Observable、Single、Completable、Maybe。发布者有一个通用final订阅方法,比如Flowable的是subscribe方法,意义就是所有的发布者订阅订阅者用的都是这个方法。

订阅者是谁呢?当发布者调用subscribe方法的时候,订阅者就产生了。subscribe方法的参数就是订阅者,就是上面的Consumer对象,Consumer的accept方法就是它对消息的消费行为。

数据是如何从发布者流向到订阅者的呢,深入到订阅方法内部看看,接下来就是展现真的技术的时候了。

public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError,
            Action onComplete) {
      	...滤去无关代码
        LambdaSubscriber<T> ls = new LambdaSubscriber<T>(onNext, onError, onComplete, FlowableInternalHelper.RequestMax.INSTANCE);
		subscribeActual(ls);
        return ls;
    }

哈哈,其实也就这样啦。通过查看源码发现,最初的订阅产生了一个封装的LambdaSubscriber,然后通过subscribeActual依次向上传递的时候LambdaSubscriber会经过一次又一次的封装,如本例demo的MapSubscriber、RangeSubscription,而且它们还有一个上下引用的关系,它们三者的关系如图:在这里插入图片描述
当RangeSubscription产生的时候订阅关系就生成了。订阅的时候flowable通过调用中间的flowable的subscribeActual依次生成中间的Subscriber和最终的Subscription;Subscription调用Subscriber的onSubscribe方法依次往下传递;最开始的Subscriber调用onSubscribe的时候反过来又去调用upstream的request方法,直到Subscription;然后Subscription开始发送数据,通过downstream的onNext方法依次吧数据从源端发送,最终数据流向到到最开始的订阅者。4个主要的方法调用方向如图:在这里插入图片描述
最后,给出一个经过整合后的类关系图
在这里插入图片描述
相关的UML图如下
在这里插入图片描述
本文文笔不好,可能写的不是很明白,看不懂没关系,看源码就行了。写本片的目的主要就是记录下曾经学习rxjava做下的一些笔记。
最后是扔物线的博客 给 Android 开发者的 RxJava 详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值