内容简介
本书首先讲解了函数式响应式编程的概念,包括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 的实战之旅吧!