彻底搞懂 RxJava — 基础篇

来源:互联网 发布:做长微博的软件 编辑:程序博客网 时间:2024/06/11 20:37

前言

这不是基础教程, 而是从源码角度带你剖析 RxJava 的实现原理. 如果你并不了解 RxJava, 请移动到文章末尾, 先看看各种 ref (为了方便你的学习, 我已经按照 入门 -> 精通 为你做了排序).

RxJava 是什么?

一种帮助你做异步的框架. 类似于 AsyncTask. 但其灵活性和扩展性远远强于前者. 从能力上讲, 如果说 AsycnTask 是 DOS 操作系统, RxJava 是 Window 操作系统.

先看看用法

1

源码解析

1. 首先来看下 `.CREATE(NEW OBSERVABLE.ONSUBSCRIBE()…`

1
2
3
publicstatic  Observable create(OnSubscribe f) {
    returnnew Observable(hook.onCreate(f));
}

`hook.onCreate(f)` 什么也没干, 直接返回了 `f`… 然后通过 `Observable` 的构造函数构造了该对象. 看代码:

1
2
3
protectedObservable(OnSubscribe f) {
 this.onSubscribe = f;
}

整理一下: `.create(new Observable.OnSubscribe()…` 实际上就是如下伪码:

  1. Observable   observable   =   new Observable();
  2. observable.onSubscribe   =   new OnSubscribe();

2. 再来看下 `.SUBSCRIBE(NEW SUBSCRIBER()…` 中发生了什么:

1
2
3
4
5
privatestatic  Subscription subscribe(Subscriber<? superT> 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(…)`.

我们来梳理一下整个故事

整个代码可以分成两大步

一. 构建 OBSERVABLE, ONSUBSCRIBE, SUBSCRIBER 三个对象

1. `Observable` 中包含一个 `onSubscribe`. 我们的代码中重载了该类的 `call` 方法
2. Subscriber 对象中我们重载了 `onNext, onComplete, onError` 方法

二. 调用上述 OBSERVABLE 对象的 `SUBSCRIBE` 方法

1. 该方法中调用了 `onSubscribe.call` 方法
2. 通常, 我们会在上面 1 中的 `call` 方法中调用 subscriber 对象的 `onNext/onComplete` 等方法

梳理一下: 我们代码中, 被调用的流程大致是  `OnSubscribe.call`  ->  `Subscriber.onNext`  ->  `Subscriber.onComplete`.

来看看图吧

我们分两步说, 首先是对象的构造顺序 (不要纠结 1, 2 的顺序… 这里只是说明性描述)

总共有三个对象产生, 一个 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 的使用)