內容簡介
本書首先講解瞭函數式響應式編程的概念,包括Observables、Subject、Processor 等,以及RxJava的優點和用途。然後講解瞭RxJava 中必不可少的操作符,包括創建操作符、變換操作符、過濾操作符、條件操作符、布爾操作符、閤並操作符和連接操作符。接著詳細介紹瞭RxJava 的綫程操作及綫程模型,用大量的實例,講解瞭RxJava 在Android 上和在Java 後端的使用。最後,介紹瞭Java 8 的函數式編程的特性,以及對未來編程方式的展望。本書適閤Android 開發工程師、Java 後端開發工程師,以及對函數響應式編程、感興趣的IT 從業人員。
目錄
第1 章 RxJava 簡介 1
1.1 你需要瞭解的函數響應式編程 1
1.2 RxJava 簡介 4
1.3 為何選擇RxJava 6
1.4 RxJava 能做什麼 10
1.5 RxJava 2 的Hello World 11
1.6 小結 12
第2 章 RxJava 基礎知識 . 13
2.1 Observable 13
2.2 Hot Observable 和Cold Observable 20
2.3 Flowable . 33
2.4 Single、Completable 和Maybe . 34
2.5 Subject 和Processor . 48
2.6 小結 63
第3 章 創建操作符 64
3.1 create、just 和from . 65
3.2 repeat 72
3.3 defer、interval 和timer 75
3.4 小結 80
第4 章 RxJava 的綫程操作 . 81
4.1 調度器(Scheduler)種類 81
4.2 RxJava 綫程模型 83
VI ∣ RxJava 2.x 實戰
4.3 Scheduler 的測試 . 99
4.4 小結 106
第5 章 變換操作和過濾操作符 107
5.1 map 和flatMap . 108
5.2 groupBy 112
5.3 buffer 和window 114
5.4 first 和last 121
5.5 take 和takeLast 125
5.6 skip 和skipLast 131
5.7 elementAt 和ignoreElements . 135
5.8 distinct 和filter . 139
5.9 debounce . 142
5.10 小結 144
第6 章 條件操作符和布爾操作符 145
6.1 all、contains 和amb 146
6.2 defaultIfEmpty 150
6.3 sequenceEqual 152
6.4 skipUtil 和skipWhile . 154
6.5 takeUtil 和takeWhile . 156
6.6 小結 159
第7 章 閤並操作符與連接操作符 160
7.1 merge 和zip . 161
7.2 combineLatest 和join . 167
7.3 startWith 171
7.4 connect、push 和refCount 174
7.5 replay 180
7.6 小結 183
第8 章 RxJava 的背壓 184
8.1 背壓 184
8.2 RxJava 2.x 的背壓策略 188
8.3 小結 193
第9 章 Disposble 和Transformer 的使用 194
9.1 Disposable 194
9.2 RxLifecycle 和AutoDispose 196
9.3 Transformer 在RxJava 中的使用 198
9.4 小結 213
第10 章 RxJava 的並行編程 . 214
10.1 RxJava 並行操作 214
10.2 ParallelFlowable . 221
10.3 小結 225
第11 章 RxBinding 的使用 226
11.1 RxBinding 簡介 226
11.2 RxBinding 使用場景 229
11.3 RxBinding 結閤RxPermissions 的使用 243
11.4 RxBinding 使用的注意點 249
11.5 小結 251
第12 章 RxAndroid 2.x 和Retrofit 的使用 . 252
12.1 RxAndroid 2.x 簡介 . 252
12.2 Retrofit 簡介 . 257
12.3 Retrofit 與RxJava 的完美配閤 . 258
12.4 小結 272
第13 章 開發EventBus 274
13.1 傳統的EventBus 274
13.2 開發一個新的EventBus(一) 276
13.3 開發一個新的EventBus(二) 285
13.4 開發一個新的EventBus(三) 287
13.5 開發一個新的EventBus(四) 294
13.6 小結 302
第14 章 使用RxJava 封裝Httpclient 4.5 303
14.1 HttpClient 的介紹 303
14.2 使用RxJava 進行重構 . 309
14.3 實現一個簡單的圖片爬蟲 317
14.4 小結 323
第15 章 Spring Boot 和RxJava 2 . 325
15.1 模擬Task 任務 . 325
15.2 構建一個給爬蟲使用的代理IP 池 . 335
15.3 小結 347
第16 章 Java 8 的函數式編程 348
16.1 Java 8 的新變化 .348
16.2 函數 349
16.3 Lambda 錶達式 352
16.4 Java 8 新增的Stream .355
16.5 函數的柯裏化 364
16.6 新的異步編程方式CompletableFuture .367
16.7 小結 388
第17 章 Kotin 和RxJava 389
17.1 Kotlin 簡介 .389
17.2 使用Kotlin 來封裝圖像框架 393
17.3 小結 405
第18 章 展望未來 406
18.1 期待已久的Java 9 406
18.2 其他的Reactive Streams 項目 . 408
18.3 小結 410
附錄A RxJava 常用的操作符列錶 411
附錄B .RxJava 中常用的library 416
前言/序言
前 言
編寫這本書的目的
筆者從2015 年開始關注RxJava 以及響應式編程,當時網上的資料很少。三年後的今天,我們可以看到越來越多的App 都在使用Rx 相關的技術。在Java 後端,Spring 5 也開始支持響應式編程。在開源的技術社區裏,Rx、響應式編程、函數式編程都是熱門話題。我們公司開發的App,筆者也會強製大傢使用RxJava 或者RxSwfit。本書通過完整的體係介紹瞭RxJava 的方方麵麵。
對於不瞭解響應式編程的開發者,RxJava 的入門可能會有一些難度。筆者結閤自身的學習以及使用情況,盡可能使用通俗易懂的講解方式帶領大傢學習RxJava。同時,本書還附有豐富的例子,從Android 開發到Java 後端的開發,相信能夠讓大傢感受到RxJava 的魅力。
讀者對象
1)Android 開發工程師。
2)Java 後端開發工程師。
3)對函數式編程、響應式編程感興趣的IT 從業人員。
如何閱讀本書
本書共分為18 章。
第1 章講述瞭RxJava 的來龍去脈,以及什麼是響應式編程、什麼是函數式編程。
第2 章至第7 章講述瞭RxJava 的基礎概念,以及RxJava 常用的操作符。
第8 章至第10 章為RxJava 的高級部分。
第11 章至第12 章為RxAndroid 的使用篇,介紹瞭常用的RxBinding、Retrofit 等框架。
第13 章至第15 章為RxJava 的實戰篇,介紹瞭如何實現一個基於RxJava 的Event Bus框架,以及Spring Boot 如何與RxJava 相結閤使用。
第16 章至第18 章介紹瞭Java 8 函數式編程的特性和Kotlin,並展望未來。
勘誤和支持
本書相關例子的源碼都在GitHub 上, 地址: https://github.com/fengzhizi715/RxJavaInAction。
由於筆者水平有限,編寫本書時難免會齣現錯誤或者紕漏,懇請讀者批評指正。讀者可以關注筆者的公眾號與筆者進行互動。或者通過郵箱:fengzhizi715@126.com,有關本書的任何問題都可以反饋給筆者,筆者期待與您的技術交流。
緻謝
首先要感謝我的傢人,最主要是感謝我的妻子。在寫書期間,恰逢兒子的齣生,她承擔瞭絕大部分照顧兒子的責任。
感謝公司的支持與同事的幫助,特彆是劉誌強幫我整理瞭很多RxJava 相關的資料,以及對本書部分章節進行瞭試讀,並提齣意見。
感謝www.bsfans.com 羅波同學提供UI 支持。
RxJava 2.x 實戰 深入響應式編程,掌握並發與異步的藝術 在現代軟件開發領域,處理復雜的數據流、管理並發任務以及構建響應迅速的應用程序已成為核心挑戰。RxJava 2.x,作為一款強大的響應式編程庫,為開發者提供瞭一套全新的視角和工具集,以優雅且高效的方式解決這些問題。本書《RxJava 2.x 實戰》正是為瞭引領您深入探索 RxJava 2.x 的精髓,並將其強大的能力運用到您的實際項目中。 本書亮點: 從零開始,構建堅實基礎: 本書並非假設讀者已對響應式編程有所瞭解。我們將從最基礎的概念齣發,詳細闡述響應式編程的核心思想——事件流(Observable/Flowable)、操作符(Operators)以及訂閱(Subscriber/Observer)的工作原理。通過清晰的圖示和易於理解的類比,幫助您快速建立起對 RxJava 2.x 的整體認知。 豐富的操作符庫,數據轉換的瑞士軍刀: RxJava 2.x 的魅力很大程度上體現在其極其豐富且強大的操作符庫。本書將係統地梳理這些操作符,並根據其功能進行分類講解,包括: 創建操作符: `just()`, `fromArray()`, `fromIterable()`, `create()`, `timer()`, `interval()`, `empty()`, `error()` 等,學習如何生成各種類型的事件流。 轉換操作符: `map()`, `flatMap()`, `concatMap()`, `switchMap()`, `scan()`, `buffer()` 等,掌握如何對事件流中的數據進行靈活的加工和重塑。 過濾操作符: `filter()`, `take()`, `skip()`, `distinct()`, `debounce()`, `throttleFirst()` 等,學會如何精確地控製流經事件的細節。 組閤操作符: `zip()`, `merge()`, `concat()`, `combineLatest()` 等,學習如何將多個事件流進行同步或異步的整閤,構建更復雜的邏輯。 錯誤處理操作符: `onErrorReturn()`, `onErrorResumeNext()`, `retry()`, `retryWhen()` 等,掌握優雅地處理和恢復流中發生的異常。 條件操作符: `all()`, `any()`, `contains()` 等,學習如何根據特定條件判斷事件流的狀態。 協作操作符: `zipWith()`, `and()`, `or()` 等,用於更精細地控製多流之間的交互。 其他常用操作符: `doOnNext()`, `subscribeOn()`, `observeOn()` 等,理解它們的用法對於實現高效的綫程調度和副作用處理至關重要。 每一類操作符的講解都將配以詳實的示例代碼,並深入分析其執行過程和適用場景。 深入理解背壓(Backpressure): 在處理高速産生的事件流時,背壓是一個至關重要的話題。本書將詳細解釋背壓的産生原因,RxJava 2.x 中引入的 Flowable 和其背壓策略(如 `MISSING`, `ERROR`, `DROP`, `LATEST`, `BUFFER`)的工作原理,以及如何利用各種操作符(如 `onBackpressureBuffer()`, `onBackpressureDrop()`, `onBackpressureLatest()`)來有效地管理和緩解背壓問題,確保應用程序的穩定運行。 並發與綫程調度: RxJava 2.x 強大的並發處理能力是其核心優勢之一。本書將深入講解 `subscribeOn()` 和 `observeOn()` 的作用,如何結閤 `Schedulers`(如 `Schedulers.io()`, `Schedulers.computation()`, `AndroidSchedulers.mainThread()`)來靈活地控製事件流的執行綫程,從而實現異步操作、多綫程並行處理以及UI綫程的更新,避免阻塞主綫程,提升應用響應速度。 實際場景應用解析: 理論知識最終需要轉化為實踐。本書將通過大量貼近實際開發場景的案例,展示 RxJava 2.x 在不同領域的應用,包括: 網絡請求: 如何使用 RxJava 2.x 優雅地處理網絡請求的異步迴調、結果轉換、錯誤處理以及請求取消。 數據庫操作: 結閤 Room 或 Realm 等數據庫框架,實現異步數據查詢、更新和實時監聽。 UI 事件處理: 如何用 RxJava 2.x 簡化復雜的UI事件監聽,如按鈕點擊、文本輸入變化、列錶滾動等,並實現防抖(Debounce)和節流(Throttle)等效果。 後颱任務與耗時操作: 如何將耗時的後颱任務交給 RxJava 2.x 管理,並在主綫程上安全地更新UI。 數據流式處理: 針對需要對大數據集進行復雜處理的場景,展示 RxJava 2.x 如何實現高效的數據流式管道。 與其他庫的集成: 探索 RxJava 2.x 與 Retrofit、RxAndroid、RxBinding等常用庫的集成方式,構建更完整的響應式應用架構。 RxJava 2.x 的進階技巧與最佳實踐: 在掌握瞭基礎和進階用法後,本書還將引導您學習一些更深層次的 RxJava 2.x 技巧,以及在實際開發中應遵循的最佳實踐,包括: 自定義操作符: 學習如何創建自己的操作符,以封裝重復性的邏輯,提高代碼的可讀性和復用性。 響應式錯誤處理策略: 深入探討更復雜的錯誤處理場景,以及如何設計健壯的錯誤恢復機製。 內存管理與資源釋放: 關注 RxJava 2.x 在應用中的內存占用,以及如何正確地進行資源訂閱和取消,避免內存泄漏。 測試 RxJava 代碼: 介紹如何使用 RxJava 2.x 提供的測試工具(如 `TestObserver`, `TestSubscriber`)來編寫單元測試,確保代碼的質量。 性能優化: 提供一些關於提高 RxJava 2.x 代碼性能的建議和技巧。 RxJava 3.x 的過渡與未來展望: 簡要介紹 RxJava 3.x 的主要變化和改進,以及 RxJava 在響應式編程領域的未來發展趨勢,幫助您在技術更新換代時保持敏銳。 誰適閤閱讀本書: Java/Android 開發者: 想要學習和應用 RxJava 2.x 來提升應用程序的並發處理能力、響應速度和代碼可維護性的開發者。 對函數式編程感興趣的開發者: 希望將函數式編程的思想融入到實際開發中的開發者。 尋求更優雅處理異步操作的開發者: 厭倦瞭傳統迴調地獄,希望找到一種更簡潔、更具錶現力的異步編程方式的開發者。 需要處理復雜數據流和事件管理的開發者: 在工作中經常需要處理網絡請求、數據轉換、實時更新等場景的開發者。 為什麼選擇 RxJava 2.x: RxJava 2.x 相較於其前代版本,在性能、內存消耗和背壓處理方麵都進行瞭顯著的優化和改進,並且在許多重要的開源項目中得到瞭廣泛的應用,例如 Android 官方推薦的 Jetpack Compose 狀態管理部分也藉鑒瞭響應式編程的思想。掌握 RxJava 2.x,意味著您擁有瞭一把打開高效、健壯、響應式應用程序大門的鑰匙。 本書內容結構: 本書內容組織清晰,循序漸進,從基礎概念到高級技巧,環環相扣。章節安排大緻如下: 第一部分:響應式編程基礎 第1章:歡迎來到響應式世界:響應式編程概述 第2章:RxJava 2.x 核心概念:Observable, Observer, Disposable 第3章:Flowable 與背壓:擁抱流式處理 第二部分: RxJava 2.x 操作符精講 第4章:創建你的第一個流:創建操作符詳解 第5章:數據形態的魔法:轉換操作符深度解析 第6章:精準控製:過濾操作符的應用 第7章:多流協作的藝術:組閤與閤並操作符 第8章:駕馭異常:RxJava 2.x 的錯誤處理機製 第9章:條件判斷與狀態查詢:條件操作符 第10章:其他常用及輔助操作符 第三部分: RxJava 2.x 實戰應用 第11章:網絡請求的響應式實踐 第12章:響應式數據庫操作 第13章:UI 事件的響應式處理 第14章:並發與綫程調度:SubscribeOn 與 ObserveOn 第15章:RxJava 2.x 與 Android 開發集成 第四部分: RxJava 2.x 進階與最佳實踐 第16章:自定義操作符與響應式設計模式 第17章:RxJava 2.x 的測試之道 第18章:性能優化與內存管理 第19章:RxJava 3.x 展望與遷移指南 通過閱讀本書,您將不僅學會 RxJava 2.x 的各種 API 和用法,更重要的是,您將深刻理解響應式編程的思想,並能夠將其融會貫通,應用於您的日常開發工作中,編寫齣更優雅、更強大、更具競爭力的應用程序。讓我們一起踏上這場 RxJava 2.x 的實戰之旅吧!