RxJava响应式编程
作者:李衍顺 著
出版时间: 2018年版
内容简介
响应式编程是一种基于异步数据流概念的编程模式,在开发手机App、Web App时,要想保证对用户请求的实时响应,给用户带来流畅的体验,响应式编程是一个不错的选择。RxJava则是这种编程模式的Java实现。本书主要介绍如何使用RxJava进行响应式编程。全书一共6章,从响应式编程与RxJava的概念,到RxJava的操作符和源码,以及各种Scheduler的特点和适用场景,均做了较细致的讲解。本书还用一章的篇幅给出了几个RxJava的实用案例,帮助读者理解概念,上手操作。本书适合RxJava的初学者,以及对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