編輯推薦
適讀人群 :Android開發者 RxJava源碼剖析
RxJava核心操作符解析
RxJava實戰案例分享
內容簡介
響應式編程是一種基於異步數據流概念的編程模式,在開發手機App、Web App時,要想保證對用戶請求的實時響應,給用戶帶來流暢的體驗,響應式編程是一個不錯的選擇。RxJava則是這種編程模式的Java實現。本書主要介紹如何使用RxJava進行響應式編程。全書一共6章,從響應式編程與RxJava的概念,到RxJava的操作符和源碼,以及各種Scheduler的特點和適用場景,均做瞭較細緻的講解。本書還用一章的篇幅給齣瞭幾個RxJava的實用案例,幫助讀者理解概念,上手操作。本書適閤RxJava的初學者,以及對RxJava有初步瞭解想要進一步深入學習的讀者閱讀。
作者簡介
目前就職於Face++,多年的移動端開發和RxJava使用經驗。
目錄
第1章 走進RxJava的世界 .......................................................................................................... 1
1.1 響應式編程.......................................................................................................................... 1
1.2 什麼是RxJava................................................................................................................ 4
1.3 Observable和Subscriber ............................................................................................... 5
1.3.1 Single:單個數據的生産者 ........................................................................................... 8
1.3.2 Completable:單個事件的生産者 .................................................................................. 9
1.4 在Android工程中引入RxJava .................................................................................. 11
第2章 RxJava中的操作符 ..................................................................................................... 12
2.1 創建Observable的操作符 .......................................................................................... 12
2.1.1 range ........................................................................................................................... 13
2.1.2 defer和just ................................................................................................................. 13
2.1.3 from ............................................................................................................................ 16
2.1.4 interval ........................................................................................................................ 17
2.1.5 repeat和timer ............................................................................................................. 19
2.2 轉化Observable的操作符 .......................................................................................... 21
2.2.1 buffer .......................................................................................................................... 21
2.2.2 flatMap ....................................................................................................................... 23
2.2.3 groupBy ...................................................................................................................... 25
2.2.4 map............................................................................................................................ 28
2.2.5 cast ............................................................................................................................. 29
2.2.6 scan ............................................................................................................................ 31
2.2.7 window ....................................................................................................................... 32
2.3 過濾操作符 .................................................................................................................. 35
2.3.1 debounce ..................................................................................................................... 35
2.3.2 distinct ........................................................................................................................ 39
2.3.3 elementAt .................................................................................................................... 40
2.3.4 filter ............................................................................................................................ 41
2.3.5 first和last ................................................................................................................... 43
2.3.6 skip和take,skipLast和takeLast ................................................................................ 45
2.3.7 sample和throttleFirst .................................................................................................. 46
2.4 組閤操作符 .................................................................................................................. 48
2.4.1 combineLatest .............................................................................................................. 48
2.4.2 join和groupJoin ......................................................................................................... 51
2.4.3 merge和mergeDelayError............................................................................................ 55
2.4.4 startWith...................................................................................................................... 58
2.4.5 switch ......................................................................................................................... 59
2.4.6 zip和zipWith .............................................................................................................. 61
2.5 錯誤處理操作符 .......................................................................................................... 64
2.5.1 onErrorReturn .............................................................................................................. 64
2.5.2 onErrorResumeNext ..................................................................................................... 66
2.5.3 onExceptionResumeNext .............................................................................................. 67
2.5.4 retry ............................................................................................................................ 70
2.6 輔助操作符 .................................................................................................................. 72
2.6.1 delay ........................................................................................................................... 72
2.6.2 do ............................................................................................................................... 74
2.6.3 materialize和dematerialize .......................................................................................... 78
2.6.4 subscribeOn和observeOn ............................................................................................ 80
2.6.5 timeInterval和timeStamp ............................................................................................ 82
2.6.6 timeout ........................................................................................................................ 84
2.6.7 using ........................................................................................................................... 87
2.7 條件操作 ...................................................................................................................... 90
2.7.1 all ............................................................................................................................... 90
2.7.2 amb............................................................................................................................ 92
2.7.3 contains ....................................................................................................................... 93
2.7.4 isEmpty ....................................................................................................................... 94
2.7.5 defaultIfEmpty ............................................................................................................. 95
2.7.6 sequenceEqual ............................................................................................................. 97
2.7.7 skipUntil和skipWhile ................................................................................................. 98
2.7.8 takeUntil和takeWhile ............................................................................................... 100
2.8 聚閤操作符 ................................................................................................................ 102
2.8.1 concat ....................................................................................................................... 102
2.8.2 count ......................................................................................................................... 104
2.8.3 reduce ....................................................................................................................... 105
2.8.4 collect ....................................................................................................................... 106
2.9 與Connectable Observable相關的操作符 ............................................................... 107
2.9.1 publish和connect ...................................................................................................... 108
2.9.2 refCount .................................................................................................................... 110
2.9.3 replay ........................................................................................................................ 111
2.10 自定義操作符 .......................................................................................................... 114
2.10.1 lift ........................................................................................................................... 115
2.10.2 compose .................................................................................................................. 117
第3章 使用Scheduler進行綫程調度 ................................................................................. 119
3.1 什麼是Scheduler ....................................................................................................... 119
3.2 Scheduler的類型 ....................................................................................................... 121
3.2.1 computation ............................................................................................................... 121
3.2.2 newThread ................................................................................................................. 122
3.2.3 io .............................................................................................................................. 122
3.2.4 immediate .................................................................................................................. 123
3.2.5 trampoline ................................................................................................................. 123
3.2.6 from .......................................................................................................................... 123
3.3 總結 ............................................................................................................................ 125
第4章 RxJava的實現原理 ................................................................................................... 126
4.1 數據的發送和接收 .................................................................................................... 126
4.1.1 創建Observable的過程 ............................................................................................. 127
4.1.2 訂閱的過程 ............................................................................................................... 128
4.2 操作符的實現 ............................................................................................................ 130
4.2.1 lift的工作原理 .......................................................................................................... 130
4.2.2 map的工作原理 ........................................................................................................ 132
4.2.3 flatMap的工作原理 ................................................................................................... 135
4.2.4 merge的工作原理 ..................................................................................................... 136
4.2.5 concat的工作原理 ..................................................................................................... 139
4.3 Scheduler的工作原理 ............................................................................................... 144
4.3.1 Scheduler源碼 .......................................................................................................... 144
4.3.2 subscribeOn的工作原理 ............................................................................................ 152
4.3.3 observeOn的工作原理 .............................................................................................. 156
第5章 RxJava的應用實例 ................................................................................................... 161
5.1 計算π的值 ................................................................................................................ 161
5.2 圖片的三級緩存 ........................................................................................................ 165
5.2.1 內存緩存 .................................................................................................................. 167
5.2.2 外存緩存 .................................................................................................................. 169
5.2.3 網絡緩存 .................................................................................................................. 172
5.2.4 緩存管理 .................................................................................................................. 173
5.2.5 封裝.......................................................................................................................... 176
5.2.6 運行測試 .................................................................................................................. 178
5.3 結閤Retrofit和OkHttp訪問網絡 ............................................................................ 181
5.3.1 卡片類的定義 ........................................................................................................... 181
5.3.2 配置OkHttp .............................................................................................................. 183
5.3.3 配置Retrofit.............................................................................................................. 186
5.4 使用RxLifecycle避免內存泄漏 ............................................................................... 189
5.4.1 修改demo工程 .................................................................................................... 189
5.4.2 綁定其他生命周期 ................................................................................................ 191
5.5 使用RxBinding綁定各種View事件....................................................................... 193
5.5.1 綁定點擊事件 ...................................................................................................... 194
5.5.2 綁定TextWatcher .................................................................................................. 196
5.5.3 綁定OnPageChangeListener ................................................................................... 197
第6章 RxJava 2的改進 ....................................................................................................... 200
6.1 Observable和Flowable ............................................................................................. 200
6.2 null的使用 ................................................................................................................. 203
6.3 Single和Completable ................................................................................................ 205
6.4 Maybe ......................................................................................................................... 207
6.5 Subscriber ................................................................................................................... 208
6.5.1 DefaultSubscriber .................................................................................................. 209
6.5.2 ResourceSubscriber ................................................................................................ 210
6.5.3 DisposableSubscriber ............................................................................................. 211
6.6 Action和Function ..................................................................................................... 212
6.7 錯誤處理 .................................................................................................................... 214
6.8 Scheduler .................................................................................................................... 216
前言/序言
前 言
毫無疑問,RxJava是一個非常優秀的開源庫,清晰的流式操作和便捷的綫程切換為Java和Android開發者提供瞭有力的幫助。網上有大量介紹RxJava的文章,開發者可以很容易地查找到相關的學習資料。但是由於RxJava入門比較睏難,而且缺乏一本係統地介紹RxJava的中文書籍,所以給很多初學者帶來瞭睏擾,不少人淺嘗輒止,放棄瞭深入學習和使用RxJava的機會,這十分可惜。本書作為一本入門書,比較適閤RxJava的初學者以及對RxJava有初步瞭解並想要進一步學習RxJava的讀者。
內容結構
本書第1章從響應式編程入手,介紹瞭RxJava及RxJava的組成部分,幫讀者初步瞭解RxJava。
第2章配閤官方的示意圖分類介紹瞭RxJava的大部分操作符。這一章的篇幅比較多,讀者在閱讀的時候可能無法全部記住,可以在需要時隨時翻閱查詢。
第3章就各種Scheduler的特點和適閤的使用場景做瞭介紹,幫助讀者根據實際需要選擇最閤適的Scheduler。
隻知道輪子怎麼跑還不夠,還有必要知道輪子是如何造的,第4章結閤源碼研究瞭RxJava的實現原理。瞭解原理一方麵可以讓我們避免用錯操作符或者Scheduler,另一方麵如果碰到RxJava中的bug,也有助於我們定位bug。發現bug後可以到GitHub上發起一個issue,而且最好能夠提一個附帶的pull request來修復這個bug。
第5章給齣瞭一些實例和基於RxJava的開源庫的使用示例,以幫助讀者更好地將RxJava應用於實際開發中。
第6章介紹瞭RxJava 2相對於RxJava 1的改進之處,如果讀者已經掌握瞭RxJava 1,那麼RxJava 2也可以很容易地上手。
給初學者的建議
RxJava這種響應式編程方式跟大多數人習慣的命令式編程方式有較大的區彆,所以初學者首先需要完成編程思想上的轉變,理解RxJava的思想。如可以將Observable看作工廠的原材料生産機器,發送齣來的數據即為原材料,整個鏈式操作可以視為原材料經過一條流水綫,每個操作符為流水綫上的一個車間,每個車間都會對原材料做一定的加工,最終的Subscriber可以視為最終消費者,會接收加工後的成品。
其次就是瞭解RxJava的操作符都有哪些,都有什麼樣的作用。你不需要一開始就將每個操作符都記住,但是可以大體上記住都有什麼功能的操作符,這樣在需要時就能夠想起哪個操作符能夠滿足當下的需求。關於操作符的詳細使用方式可以參閱第2章。
接下來就是實踐環節瞭。初期可以嘗試應用RxJava寫一些小程序,並參閱網上的一些開源代碼,看看彆人都是怎麼應用RxJava的。初步掌握之後就可以逐漸將RxJava引入到項目中,來解決一些工作過程中遇到的實際問題。隻看不做永遠都是眼高手低,隻有將RxJava真正地應用到實際開發工作中,不斷犯錯、不斷改進纔能真正達到融會貫通的地步,纔能真正地掌握RxJava的使用技巧。
最後,如果想要進一步學習RxJava,可以閱讀源代碼,可以深入地跟蹤一個操作符的實現過程來瞭解其原理。如果有可能,可以參與到RxJava的bug修復或者新功能開發中,在GitHub上給RxJava提pull request,上麵有很多大神會給你提各種修改意見,理解他們的思路絕對會讓你受益匪淺。
RxJava響應式編程:構建流暢、可伸縮、響應迅速的現代應用 簡介 在當今快速迭代的軟件開發環境中,構建能夠處理異步事件、應對復雜交互並保持流暢用戶體驗的應用變得前所未有的重要。傳統的命令式編程模型,雖然強大,但在麵對日益增長的數據流和並發挑戰時,往往會暴露齣其局限性。錯誤處理的復雜性、狀態管理的混亂以及難以維護的代碼,都可能成為阻礙開發效率和應用質量的絆腳石。 “RxJava響應式編程”這本書,正是為瞭解決這些痛點而生。它將帶您踏上一段深入探索響應式編程範式的旅程,聚焦於 RxJava 這一強大的工具庫。通過本書,您將不再被動地響應用戶的每一次點擊或事件,而是主動地構建一種能夠優雅地管理和響應數據流的係統。您將學會如何用更聲明式、更富有錶現力的方式來處理異步操作,從而編寫齣更簡潔、更易於理解、更健壯的應用。 本書的編寫,旨在為開發者提供一個全麵而深入的 RxJava 學習指南,從基礎概念的建立,到高級模式的應用,再到實際場景的解決方案。我們不追求技術的堆砌,而是力求將復雜的響應式編程思想,以清晰、循序漸進的方式呈現給您。無論是初學者對響應式編程感到好奇,還是有經驗的開發者希望提升自己的異步處理能力,都能在本書中找到所需的知識和啓發。 內容梗概 本書圍繞 RxJava 核心概念展開,逐步深入,旨在幫助您構建堅實的響應式編程基礎,並掌握將其應用於實際開發場景的技巧。 第一部分:響應式編程的基石 為什麼需要響應式編程? 探討傳統命令式編程在處理異步和並發時的局限性。 分析當前軟件開發麵臨的挑戰,如數據流的爆炸式增長、用戶體驗的重要性以及對應用可伸縮性的需求。 引入響應式編程的概念,闡述其核心優勢:聲明式、聲明式、優雅的錯誤處理、可組閤性以及對異步事件的集中管理。 通過簡單的類比(如水流、事件訂閱),幫助讀者建立對響應式編程的直觀理解。 RxJava 概覽:踏入響應式世界 RxJava 是什麼?它解決瞭什麼問題? RxJava 的核心組成部分:Observable、Observer、Subscriber、Operator、Subject。 Observable:數據流的生産者,如何發齣數據、完成或錯誤。 Observer/Subscriber:數據流的消費者,如何訂閱、接收數據、處理錯誤和完成信號。 RxJava 的基本生命周期:onNext, onError, onComplete。 第一個 RxJava 程序:從一個簡單的“Hello, RxJava!”開始,熟悉基本 API 和運行流程。 第二部分:RxJava 的核心概念與操作符 Observable 的深入探索 創建 Observable 的各種方式:`create`, `just`, `fromArray`, `fromIterable`, `empty`, `never`, `error`。 理解 Observable 的“冷”與“熱”:`defer`, `share`。 Observable 的生命周期管理:`subscribeOn`, `observeOn` 對綫程調度的影響。 Observer 和 Subscriber 的精細控製 Observer 和 Subscriber 的區彆與聯係。 Subscriber 的強大功能:`onStart`, `isDisposed`。 如何安全地管理 Subscription:`unsubscribe`, `add`, `remove`, `clear`。 事件序列的生命周期管理:`CompositeSubscription` 的應用。 操作符:數據流的魔術師 過濾操作符: `filter`, `distinct`, `take`, `skip`, `debounce`, `throttleFirst`, `elementAt`。學習如何根據條件選擇或忽略數據。 轉換操作符: `map`, `flatMap`, `concatMap`, `switchMap`, `scan`, `buffer`, `window`。掌握如何對數據流進行轉換和重組。 組閤操作符: `zip`, `merge`, `concat`, `combineLatest`, `amb`。學習如何將多個數據流閤並成一個。 條件和布爾操作符: `any`, `all`, `contains`, `sequenceEqual`。理解如何對整個數據流進行判斷。 錯誤處理操作符: `onErrorReturn`, `onErrorResumeNext`, `retry`, `retryWhen`。學習如何優雅地處理和恢復錯誤。 輔助操作符: `doOnNext`, `doOnError`, `doOnComplete`, `doOnSubscribe`。用於調試和側麵操作。 第三部分:Subject:Observable 與 Observer 的橋梁 Subject 的多樣化: `PublishSubject`:隻發送訂閱後發齣的事件。 `BehaviorSubject`:發送訂閱時最近的一個事件,以及之後的所有事件。 `ReplaySubject`:發送訂閱時所有曆史事件,以及之後的所有事件(可配置緩存大小)。 `AsyncSubject`:隻在 Observable 完成時發送最後一個數據。 Subject 的應用場景: 作為多播源,將一個 Observable 的事件分發給多個 Observer。 實現事件總綫(Event Bus)模式。 狀態管理和 UI 更新。 第四部分:RxJava 的綫程調度與並發 綫程調度的重要性: 理解 RxJava 中的綫程模型:`Scheduler` 及其實現(`NewThreadScheduler`, `TrampolineScheduler`, `CachedThreadScheduler`, `IOScheduler`, `ComputationScheduler`)。 `subscribeOn` 與 `observeOn` 的區彆和聯閤使用。 避免在主綫程執行耗時操作,保證 UI 流暢。 並發處理策略: 使用 `flatMap` 等操作符處理並發請求。 控製並發數量:`flatMap` 的第二個參數,`concatMap` 的適用性。 處理並發異常和超時。 第五部分:RxJava 在實際場景中的應用 網絡請求的響應式處理: 使用 RxJava 配閤 Retrofit 等網絡庫,簡化網絡請求的迴調管理。 處理網絡請求的重試、緩存、取消等。 組閤多個網絡請求,等待所有結果。 UI 事件流的管理: 將 UI 事件(點擊、輸入、滾動)轉換為 Observable。 使用 RxJava 實現復雜的 UI 交互邏輯,如防抖、節流、聯動。 構建響應式的 UI 組件。 異步操作的集中管理: 處理文件 I/O、數據庫操作等異步任務。 將復雜的異步流程分解為可管理的 Observable 鏈。 響應式錯誤處理策略: 構建健壯的錯誤處理機製,避免應用崩潰。 全局錯誤處理與局部錯誤處理。 優雅地嚮用戶呈現錯誤信息。 第六部分:高級主題與最佳實踐 RxJava 的背壓(Backpressure)機製: 理解背壓的産生原因和影響。 RxJava 2.x 中的背壓處理策略:`onBackpressureBuffer`, `onBackpressureDrop`, `onBackpressureLatest`。 何時需要關注背壓,以及如何避免。 RxJava 的測試: 編寫可測試的 RxJava 代碼。 使用 `TestObserver` 進行單元測試。 測試 Observable 的發射、完成和錯誤。 測試操作符的行為。 RxJava 的性能優化: 理解 RxJava 操作符的開銷。 避免不必要的計算和內存占用。 選擇閤適的綫程調度器。 響應式編程的架構模式: 在實際項目中如何引入和應用 RxJava。 與其他技術棧的集成。 維護和擴展響應式代碼。 本書特色 循序漸進的教學方法: 從基礎概念到高級應用,逐步引導讀者深入理解 RxJava。 豐富的代碼示例: 提供大量清晰、可運行的代碼片段,幫助讀者實踐和理解。 實戰導嚮: 聚焦於 RxJava 在實際開發中的應用場景,解決開發者在日常工作中遇到的問題。 深入的原理剖析: 不僅教授如何使用 RxJava,更深入解析其背後的原理,幫助讀者建立深刻的認知。 強調最佳實踐: 引導讀者掌握 RxJava 的優雅寫法,寫齣可維護、可擴展的代碼。 麵嚮開發者: 語言風格清晰、直接,避免冗餘和空洞的描述,專注於為開發者提供有價值的知識。 閱讀本書,您將能夠: 信心十足地構建異步和事件驅動的應用。 用更簡潔、更具錶達力的方式處理復雜的數據流。 顯著提升應用的響應速度和用戶體驗。 寫齣更易於理解、調試和維護的代碼。 成為一名更齣色的現代應用開發者。 無論您是 Android 開發者、Java 後端開發者,還是任何需要處理異步編程的工程師,RxJava 響應式編程都將為您打開一扇通往更高效、更優雅編程世界的大門。讓我們一起,用響應式思維,構建齣色的應用!