徹底搞懂 RxJava — 基礎篇
前言
這不是基礎教程, 而是從原始碼角度帶你剖析 RxJava 的實現原理. 如果你並不瞭解 RxJava, 請移動到文章末尾, 先看看各種 ref (為了方便你的學習, 我已經按照 入門 -> 精通 為你做了排序).
RxJava 是什麼?
一種幫助你做非同步的框架. 類似於 AsyncTask. 但其靈活性和擴充套件性遠遠強於前者. 從能力上講, 如果說 AsycnTask 是 DOS 作業系統, RxJava 是 Window 作業系統.
先看看用法
原始碼解析
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()…` 實際上就是如下偽碼:
- Observable observable = new Observable();
- 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原始碼分析
讀原始碼!
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 的使用)
相關文章
- 徹底搞懂徹底搞懂事件驅動模型 - Reactor事件模型React
- 徹底搞懂https原理HTTP
- 徹底搞懂Bean載入Bean
- 徹底搞懂JavaScript作用域JavaScript
- 徹底搞懂 Git-RebaseGit
- 從原理到實戰,徹底搞懂Nginx(高階篇)Nginx
- 一篇文章帶你徹底搞懂join的用法
- 深入JavaScript系列(四):徹底搞懂thisJavaScript
- 一文徹底搞懂BERT
- 徹底搞懂 Kubernetes 中的 Events
- 徹底搞懂Python中的類Python
- 徹底搞懂 Channel 實現原理
- 徹底搞懂IO多路複用
- 徹底搞懂HTTPS的加密機制HTTP加密
- 徹底搞懂JavaScript原型和原型鏈JavaScript原型
- 徹底搞懂JavaScript中的繼承JavaScript繼承
- 看完讓你徹底搞懂Websocket原理Web
- 混合移動App乾貨:一篇就可以徹底搞懂!APP
- 徹底搞懂Scrapy的中介軟體(二)
- 徹底搞懂Scrapy的中介軟體(一)
- 徹底搞懂Object和Function的關係ObjectFunction
- 從原理到實戰,徹底搞懂NginxNginx
- Flutter(五)之徹底搞懂Dart非同步FlutterDart非同步
- 徹底搞懂原型、原型鏈和繼承原型繼承
- 徹底搞懂瀏覽器Event-loop瀏覽器OOP
- 徹底搞懂Scrapy的中介軟體(三)
- 徹底搞懂 python 中文亂碼問題Python
- 兩萬字長文,徹底搞懂Kafka!Kafka
- 徹底搞懂Composer自動載入原理
- 這一次,徹底搞懂 Go CondGo
- 一文徹底搞懂ZAB演算法,看這篇就夠了!!!演算法
- 一文徹底搞懂Raft演算法,看這篇就夠了!!!Raft演算法
- 兩張圖徹底搞懂MyBatis的Mapper原理!MyBatisAPP
- 徹底搞懂容器技術的基石: namespace (下)namespace
- 徹底搞懂同步非同步與阻塞非阻塞非同步
- 徹底搞懂Python 中的 import 與 from importPythonImport
- 看了這篇,我確定你已經徹底搞懂Java的繼承了Java繼承
- 徹底搞懂 MySQL 事務的隔離級別MySql
- 一張圖徹底搞懂Spring迴圈依賴Spring