这不是基础教程, 而是从源码角度带你剖析 RxJava 的实现原理. 如果你并不了解 RxJava, 请移动到文章末尾, 先看看各种 ref (为了方便你的学习, 我已经按照 入门 -> 精通 为你做了排序).
一种帮助你做异步的框架. 类似于 AsyncTask. 但其灵活性和扩展性远远强于前者. 从能力上讲, 如果说 AsycnTask 是 DOS 操作系统, RxJava 是 Window 操作系统.
1
2
3
|
public
static
Observable create(OnSubscribe f) {
return
new
Observable(hook.onCreate(f));
}
|
`hook.onCreate(f)` 什么也没干, 直接返回了 `f`… 然后通过 `Observable` 的构造函数构造了该对象. 看代码:
1
2
3
|
protected
Observable(OnSubscribe f) {
this
.onSubscribe = f;
}
|
整理一下: `.create(new Observable.OnSubscribe()…` 实际上就是如下伪码:
1
2
3
4
5
|
private
static
Subscription subscribe(Subscriber
super
T> subscriber, Observable observable) {
// 略去诸多无关代码...
hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);
// 略去...
}
|
可以说, `subscribe` 仅仅是调用了 `hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);`.
`hook` 是什么? 看一下源码就知道, `hook` 是一个 proxy 对象, 仅仅用作调试的时候可以插入一些测试代码. 所以上述的 `hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);` => `onSubscribe.call(subscriber);`.
现在整理一下: `Xxx.subscribe(…)` 实际上调用了 `Xxx.onSubscribe.call(…)`.
整个代码可以分成两大步
1. `Observable` 中包含一个 `onSubscribe`. 我们的代码中重载了该类的 `call` 方法
2. Subscriber 对象中我们重载了 `onNext, onComplete, onError` 方法
1. 该方法中调用了 `onSubscribe.call` 方法
2. 通常, 我们会在上面 1 中的 `call` 方法中调用 subscriber 对象的 `onNext/onComplete` 等方法
梳理一下: 我们代码中, 被调用的流程大致是 `OnSubscribe.call` -> `Subscriber.onNext` -> `Subscriber.onComplete`.
总共有三个对象产生, 一个 Observable (被观察者), 一个 OnSubscribe (触发被观察事件的类, 通过重载其 call 函数), 以及一个 Subscriber (观察者).
简言之, 是通过 `observable.subscribe` 函数, 调用其内部的 `observable.onSubscribe.call(…)`, 而 `onSubscribe.call` 则是我们在 `Observable.create(…)` 时重写的 `call`, 此函数(图中 2) 中, 我们继而调用了 `subscriber.onNext(…)` 等函数(图中 3)
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)
The Operators of ReactiveX (帮你快速找到所需要的 Operator)
其它
Awesome-RxJava
RxJava Essential CN (帮助你了解各种 Operator 的使用)