编辑推荐
适读人群 :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 响应式编程都将为您打开一扇通往更高效、更优雅编程世界的大门。让我们一起,用响应式思维,构建出色的应用!