彻底搞懂 RxJava — 中级篇
来源:互联网 发布:少儿编程培训 达内 编辑:程序博客网 时间:2024/06/05 18:06
前言
本文献给所有想要深入了解 RxJava 的人.
如果你还没阅读过基础部分, 请先补习一下功课. 此外, 强烈建议你先过两遍源码的主要逻辑后再读本文.
本文带你理解 RxJava 的实现思路, 并解释源码中如何通过多级 Observable < – > Subscriber 实现 `Observable.map` 等 ‘变换’ 操作.
按照惯例, 还是先看一下用法
这里比较神奇的地方是这个 `map`. 下面让我们一步一步的解析 `create` -> `map` -> `subscribe` 所发生的故事.
第一步: 回忆代码 `OBSERVABLE.CREATE`
create 后, 我们便有了一个 Observable 对象, 该对象中, 还有 onSubscribe 子对象. 如下图
第二步: `MAP` 的实现 (难度: 四星半. 等级: 重要)
(点击图片看大图)
这个 `map` 实际上做了两件大事:
1)第一件事儿是 new 了一个 ‘变形函数’, 保存在了 `OperatorMap.transform` 中
2) new了一个新的 Observable. 这个 Observable 的构造函数中, 传入了一个新的 OnSubscribe. 整个 `lift` 函数的难点就在于这个 OnSubscribe 对象中. 我们仔细看一下它做了什么. 它其实也做了两件大事儿:
a) OnSubscribe.call 函数中, 看一下源码:
`hook.onLift(operator).call(o)` 创建了一个新的 Subscriber (实际上是一个 proxy), 并在 `Subscriber.onNext` 中调用 `transform` 函数对参数 `t` 进行变形, 然后将变形结果转发给 `o.onNext`. 这么上面这些变量都是哪里的呢? 下面的文字请先记住:
`transform` 实际上就是我们 1) 中分析的那个 ‘变形函数’.
`o` 则是我们还没分析的 ‘第三步’ 中, `subscribe(…)` 的用户最终的 Subscriber 对象.
b) OnSubscribe.call 做的第二件事儿是调用 ‘第一步’ 中 `create` 创建出来的 Observable.onSubscribe 函数! 注意, 这里调用的不是 `map` 自身创建的 observable, 而是 ‘第一步’ 创建的那个. 看下面这个图帮助你理解:
很简单, 该 ‘变形函数’ 保存在了 `OperatorMap.transform` 中.
总结一下 `map` 的行为:
- 创建了一个新的 Observable,
- 创建了一个新的 OnSubscribe: 其中的 `call` 方法是整个调用链的关键. 它调用了上一级 `Observable.onSubscribe.call`, 同时, 还将结果通过 `transform` 对 ‘第一步’ 处理后的结果进行变形, 然后将变形后的结果再转发给 ‘第三步’ 中 `subscribe(Subscriber…)` 中的 `Subscriber` 处理. 那我们马上看一下 ‘第三步’.
第三步: `SUBSCRIBE` 触发整个回调流程. 我们来看一下主要流程(图中省略与本步骤无关的其它流程)
这一步也很简单, 就是通过 `Observable.subscribe` 调用该对象的 `Observable.onSubscribe.call` 方法, 然后经过一系列调用, 最终由该对象内部临时创建的 Subscriber 对象(上文中的 proxy 对象) 调用用户目标 Subscriber (即代码中 `.subscribe(…)` 中的参数) 的方法.
整体梳理
第一步
第二步
第三步
另:
本人 ps 水平有限, 图有些凌乱请见谅
科学无国界, 感谢 bruce 和 扔物线大神的优秀文章和从你们那里盗来的图
Refs:
Grokking 带你入门
Grokking RxJava, Part 1: The Basics
Grokking RxJava, Part 2: Operator, Operator
Grokking RxJava, Part 3: Reactive with Benefits
Grokking RxJava, Part 4: Reactive Android
Bruce 大头鬼
RxJava基本流程和lift源码分析
扔物线大神
给 Android 开发者的 RxJava 详解
读源码!
ReactiveX/RxJava
walfud 彻底搞懂 RxJava 系列
彻底搞懂 RxJava — 初级篇
彻底搞懂 RxJava — 中级篇
彻底搞懂 RxJava — 高级篇
学以致用:
FlowImageLoader — 基于 RxJava 实现的图片异步加载库. 该库作者即 ‘彻底搞懂 RxJava 系列` 作者
Rx 规范
ReactiveX — An API for asynchronous programming (其中最有用的是 Contract)
其它
Awesome-RxJava
RxJava Essential CN (帮助你了解各种 Operator 的使用)
- 彻底搞懂 RxJava — 中级篇
- 彻底搞懂 RxJava — 基础篇
- 彻底搞懂 RxJava — 高级篇
- 彻底搞懂 RxJava
- RxJava:walfud 彻底搞懂 RxJava 系列 笔记
- 最后补充一个RxJava博客:walfud 彻底搞懂 RxJava 系列
- 彻底搞懂CoordinatorLayout
- 彻底搞懂CNN
- 彻底搞懂CNN
- 彻底搞懂CNN
- 《彻底搞懂C指针》
- 彻底搞懂字符编码
- 彻底搞懂反转索引
- 彻底搞懂Oracle字符集
- 彻底搞懂Java ClassLoader
- 彻底搞懂Oracle字符集
- 彻底搞懂Oracle字符集
- 彻底搞懂HTTP协议
- Nginx+FastCGI运行原理
- Apple for semantic-ui
- datagridview导出到Excel
- Hadoop分布式集群环境搭建
- swift中通知NSNotificationCenter的使用
- 彻底搞懂 RxJava — 中级篇
- (OK) MPTCP demo
- html学习笔记day1,2017/5/17
- 极光推送使用心得(简单使用)
- 些许牢骚
- 栈实现队列和队列实现栈原理
- 常用正则表达式
- Launcher笔记(1)-初始化与加载
- 爱测未来移动-iTest的实战应用实例