徹底搞懂 RxJava — 基礎篇

yangxi_001發表於2017-05-17

前言

這不是基礎教程, 而是從原始碼角度帶你剖析 RxJava 的實現原理. 如果你並不瞭解 RxJava, 請移動到文章末尾, 先看看各種 ref (為了方便你的學習, 我已經按照 入門 -> 精通 為你做了排序).

RxJava 是什麼?

一種幫助你做非同步的框架. 類似於 AsyncTask. 但其靈活性和擴充套件性遠遠強於前者. 從能力上講, 如果說 AsycnTask 是 DOS 作業系統, RxJava 是 Window 作業系統.

先看看用法

1

原始碼解析

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

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. Observable   observable   =   new Observable();
  2. observable.onSubscribe   =   new OnSubscribe();

2. 再來看下 `.SUBSCRIBE(NEW SUBSCRIBER()…` 中發生了什麼:

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(…)`.

我們來梳理一下整個故事

整個程式碼可以分成兩大步

一. 構建 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 的使用)

相關文章