RxJava2 的原理浅析

RxJava

RxJava 的依赖

reactive-streams 是rxjava2的唯一依赖,rxjava用到了这个库的4个关键类

  • publisher
  • processor
  • subscriber
  • subscription

其中最为主要的就是 publisher, subscriber, subscribption。
processor在事件总线中会用到,我们以后讨论。


Flows.png

主要流程就是 Publisher 执行 subscribe 方法,调用 Subscriber,然后 subscriber调用 onSubscribe方法,调用 subscription, subscription调用 request方法以后,我们的RxJava就开始跑了,当然实际上还要复杂一点。

一个简单例子

Flowable.just(1)
                .filter(integer -> integer >= 1)
                .map(integer -> integer * integer)
                .subscribe(integer -> {
                    System.out.println(integer);
                });

我们会顺序构造 FlowableJust, FlowableFilter, FlowableMap, 然后我们会得到一个Flowable,

Flowable flowable = Flowable.just(1)
                .filter(integer -> integer >= 1)
                .map(integer -> integer * integer);

然后我们执行一次subscribe

flowable.subscribe(integer -> {
                    System.out.println(integer);
                });

追溯Flowable的subscribe方法


Screen Shot 2018-01-19 at 9.01.07 PM.png
Screen Shot 2018-01-19 at 8.59.36 PM.png

我们会发现类似于 publisher的 subscribe方法,consumer会被包装成为一个subscriber(在我们的例子里就是一个LambdaSubscriber),只不过,这里的subscribe方法,其实真正执行的是Flowable的subscribeActual方法


Screen Shot 2018-01-19 at 9.02.54 PM.png

而subscribeActual是抽象方法,真正执行的时候,比如FlowableMap中


Screen Shot 2018-01-19 at 9.04.27 PM.png

执行的是source.subscribe,这里的source就是上游,比如我们例子中的flowableMap,它的上游就是flowableFilter。Flowable已经实现了subscribe方法并且该方法用final修饰,所以它无法被子类复写,我们会发现flowable的subscribe方法会产生一个递归,flowableMap先调用 subscribe,然后发生flowableFilter.subscribe,直到递归到flowableJust的时候
Screen Shot 2018-01-19 at 9.13.19 PM.png

开始执行onSubcribe, 这里subscribe递归彻底结束,开始回溯。FlowableJust会先调用FilterSubscribe的onSubscribe方法,其实就是 BasicFuseableSubscriber 的 onSubscribe方法,顺带着给this.s 赋值,这个this.s其实是一个Subscription,表示当前flowable的上游。
Screen Shot 2018-01-21 at 1.56.50 AM.png

这里actual是下游的subscriber,所以会一直执行onSubscribe方法直到最终会跑到我们的那个包装consumer的Subscriber,也就是LambdaSubscriber,在LambdaSubscriber里面


Screen Shot 2018-01-21 at 2.01.36 AM.png

accept方法会最终执行。观察Flowable的subscribe(Consumer c)方法
Screen Shot 2018-01-21 at 2.07.32 AM.png

FlowableInternalHelper.RequestMax.INSTANCE本质上就是一个consumer,它最终子LambdaSubscriber的onSubscriber里面执行了accept方法


Screen Shot 2018-01-21 at 2.09.06 AM.png

接下来,就是开始request了,执行request类似于subscribe,会反复递归调用,
因为执行request方法的是subscription,刚才在BasicFuseableSubscriber类里面,this.s就是一个subscription并且在onSubscribe方法里被赋值。request反复递归调用最终会跑到ScalarSubscription, 在这里,request方法里,开始执行onNext,


Screen Shot 2018-01-21 at 2.45.34 AM.png

接下来的事情就简单了,无非就是一个subscriber执行onNext,传递数据到下一个onNext,依次执行。FlowableFilter里面特殊一点,会执行tryOnNext方法


Screen Shot 2018-01-21 at 2.49.37 AM.png

在没有线程切换的情况下,我们可以看一下RxJava2调用的栈帧,大体流程就是先subscribe 再执行onSubscribe 再执行 request,然后就会真正从头开始处理数据了。这也就是文章最开始提到的reactive-streams的基本数据处理架构。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容