编辑推荐

适读人群:Android开发者

RxJava源码剖析

RxJava核心操作符解析

RxJava实战案例分享

内容简介

响应式编程是一种基于异步数据流概念的编程模式,在开发手机App、WebApp时,要想保证对用户请求的实时响应,给用户带来流畅的体验,响应式编程是一个不错的选择。RxJava则是这种编程模式的Java实现。《RxJava响应式编程》主要介绍如何使用RxJava进行响应式编程。《RxJava响应式编程》一共6章,从响应式编程与RxJava的概念,到RxJava的操作符和源码,以及各种Scheduler的特点和适用场景,均做了较细致的讲解。《RxJava响应式编程》还用一章的篇幅给出了几个RxJava的实用案例,帮助读者理解概念,上手操作。《RxJava响应式编程》适合RxJava的初学者,以及对RxJava有初步了解想要进一步深入学习的读者阅读。

作者简介

目前就职于Face++,多年的移动端开发和RxJava使用经验。

目录

第1章走进RxJava的世界..........................................................................................................1
1.1响应式编程..........................................................................................................................1
1.2什么是RxJava................................................................................................................4
1.3Observable和Subscriber...............................................................................................5
1.3.1Single:单个数据的生产者...........................................................................................8
1.3.2Completable:单个事件的生产者..................................................................................9
1.4在Android工程中引入RxJava..................................................................................11
第2章RxJava中的操作符.....................................................................................................12
2.1创建Observable的操作符..........................................................................................12
2.1.1range...........................................................................................................................13
2.1.2defer和just.................................................................................................................13
2.1.3from............................................................................................................................16
2.1.4interval........................................................................................................................17
2.1.5repeat和timer.............................................................................................................19
2.2转化Observable的操作符..........................................................................................21
2.2.1buffer..........................................................................................................................21
2.2.2flatMap.......................................................................................................................23
2.2.3groupBy......................................................................................................................25
2.2.4map............................................................................................................................28
2.2.5cast.............................................................................................................................29
2.2.6scan............................................................................................................................31
2.2.7window.......................................................................................................................32
2.3过滤操作符..................................................................................................................35
2.3.1debounce.....................................................................................................................35
2.3.2distinct........................................................................................................................39
2.3.3elementAt....................................................................................................................40
2.3.4filter............................................................................................................................41
2.3.5first和last...................................................................................................................43
2.3.6skip和take,skipLast和takeLast................................................................................45
2.3.7sample和throttleFirst..................................................................................................46
2.4组合操作符..................................................................................................................48
2.4.1combineLatest..............................................................................................................48
2.4.2join和groupJoin.........................................................................................................51
2.4.3merge和mergeDelayError............................................................................................55
2.4.4startWith......................................................................................................................58
2.4.5switch.........................................................................................................................59
2.4.6zip和zipWith..............................................................................................................61
2.5错误处理操作符..........................................................................................................64
2.5.1onErrorReturn..............................................................................................................64
2.5.2onErrorResumeNext.....................................................................................................66
2.5.3onExceptionResumeNext..............................................................................................67
2.5.4retry............................................................................................................................70
2.6辅助操作符..................................................................................................................72
2.6.1delay...........................................................................................................................72
2.6.2do...............................................................................................................................74
2.6.3materialize和dematerialize..........................................................................................78
2.6.4subscribeOn和observeOn............................................................................................80
2.6.5timeInterval和timeStamp............................................................................................82
2.6.6timeout........................................................................................................................84
2.6.7using...........................................................................................................................87
2.7条件操作......................................................................................................................90
2.7.1all...............................................................................................................................90
2.7.2amb............................................................................................................................92
2.7.3contains.......................................................................................................................93
2.7.4isEmpty.......................................................................................................................94
2.7.5defaultIfEmpty.............................................................................................................95
2.7.6sequenceEqual.............................................................................................................97
2.7.7skipUntil和skipWhile.................................................................................................98
2.7.8takeUntil和takeWhile...............................................................................................100
2.8聚合操作符................................................................................................................102
2.8.1concat.......................................................................................................................102
2.8.2count.........................................................................................................................104
2.8.3reduce.......................................................................................................................105
2.8.4collect.......................................................................................................................106
2.9与ConnectableObservable相关的操作符...............................................................107
2.9.1publish和connect......................................................................................................108
2.9.2refCount....................................................................................................................110
2.9.3replay........................................................................................................................111
2.10自定义操作符..........................................................................................................114
2.10.1lift...........................................................................................................................115
2.10.2compose..................................................................................................................117
第3章使用Scheduler进行线程调度.................................................................................119
3.1什么是Scheduler.......................................................................................................119
3.2Scheduler的类型.......................................................................................................121
3.2.1computation...............................................................................................................121
3.2.2newThread.................................................................................................................122
3.2.3io..............................................................................................................................122
3.2.4immediate..................................................................................................................123
3.2.5trampoline.................................................................................................................123
3.2.6from..........................................................................................................................123
3.3总结............................................................................................................................125
第4章RxJava的实现原理...................................................................................................126
4.1数据的发送和接收....................................................................................................126
4.1.1创建Observable的过程.............................................................................................127
4.1.2订阅的过程...............................................................................................................128
4.2操作符的实现............................................................................................................130
4.2.1lift的工作原理..........................................................................................................130
4.2.2map的工作原理........................................................................................................132
4.2.3flatMap的工作原理...................................................................................................135
4.2.4merge的工作原理.....................................................................................................136
4.2.5concat的工作原理.....................................................................................................139
4.3Scheduler的工作原理...............................................................................................144
4.3.1Scheduler源码..........................................................................................................144
4.3.2subscribeOn的工作原理............................................................................................152
4.3.3observeOn的工作原理..............................................................................................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章RxJava2的改进.......................................................................................................200
6.1Observable和Flowable.............................................................................................200
6.2null的使用.................................................................................................................203
6.3Single和Completable................................................................................................205
6.4Maybe.........................................................................................................................207
6.5Subscriber...................................................................................................................208
6.5.1DefaultSubscriber..................................................................................................209
6.5.2ResourceSubscriber................................................................................................210
6.5.3DisposableSubscriber.............................................................................................211
6.6Action和Function.....................................................................................................212
6.7错误处理....................................................................................................................214
6.8Scheduler....................................................................................................................216

前言/序言

前言

毫无疑问,RxJava是一个非常优秀的开源库,清晰的流式操作和便捷的线程切换为Java和Android开发者提供了有力的帮助。网上有大量介绍RxJava的文章,开发者可以很容易地查找到相关的学习资料。但是由于RxJava入门比较困难,而且缺乏一本系统地介绍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,而且最好能够提一个附带的pullrequest来修复这个bug。

第5章给出了一些实例和基于RxJava的开源库的使用示例,以帮助读者更好地将RxJava应用于实际开发中。

第6章介绍了RxJava2相对于RxJava1的改进之处,如果读者已经掌握了RxJava1,那么RxJava2也可以很容易地上手。

给初学者的建议

RxJava这种响应式编程方式跟大多数人习惯的命令式编程方式有较大的区别,所以初学者首先需要完成编程思想上的转变,理解RxJava的思想。如可以将Observable看作工厂的原材料生产机器,发送出来的数据即为原材料,整个链式操作可以视为原材料经过一条流水线,每个操作符为流水线上的一个车间,每个车间都会对原材料做一定的加工,最终的Subscriber可以视为最终消费者,会接收加工后的成品。

其次就是了解RxJava的操作符都有哪些,都有什么样的作用。你不需要一开始就将每个操作符都记住,但是可以大体上记住都有什么功能的操作符,这样在需要时就能够想起哪个操作符能够满足当下的需求。关于操作符的详细使用方式可以参阅第2章。

接下来就是实践环节了。初期可以尝试应用RxJava写一些小程序,并参阅网上的一些开源代码,看看别人都是怎么应用RxJava的。初步掌握之后就可以逐渐将RxJava引入到项目中,来解决一些工作过程中遇到的实际问题。只看不做永远都是眼高手低,只有将RxJava真正地应用到实际开发工作中,不断犯错、不断改进才能真正达到融会贯通的地步,才能真正地掌握RxJava的使用技巧。

最后,如果想要进一步学习RxJava,可以阅读源代码,可以深入地跟踪一个操作符的实现过程来了解其原理。如果有可能,可以参与到RxJava的bug修复或者新功能开发中,在GitHub上给RxJava提pullrequest,上面有很多大神会给你提各种修改意见,理解他们的思路绝对会让你受益匪浅。


其他推荐