SlideShare a Scribd company logo
使⽤用 RxJava 让数据流动
Tankery @ Mobvoi inc.
Agenda
• 遇到了了什什么困难?为什什么需要 RxJava
• 什什么是 RxJava: 概略略介绍
• RxJava API: 详细介绍、使⽤用说明
• Ex Extensions: 功能增强
• ⼀一些坑,以及如何避免
遇到了了什什么难题?为何需要
RxJava
我们需要异步、但它很麻烦
• Callback

使⽤用麻烦、回调嵌套(callback-hell)、错误处理理、取消操作
• Future<T>, CompletableFuture<T> (Java8)

功能简单、可⽤用场景太少。

Future 太弱了了,只能阻塞式的获取。

CompletableFuture 只⽀支持⼀一个数据的处理理。Java 8
• RxJava

链式调⽤用,处理理“将来”的数据

统⼀一的错误处理理,不不⽤用层层传递;统⼀一的数据更更新、注销接⼝口

数据流,⽽而不不是单个数据
Callback 和 RxJava
从⽹网络获取⼀一串串数据,从第11
位开始取5个数据打印出来。
Source: https://github.com/ReactiveX/RxJava/wiki/How-To-Use-RxJava
⾯面向数据流的编程⽅方式
• 传统编程⽅方式是命令式编程:

重视控制(执⾏行行过程),以运算、循环、条件判断、跳转来完成任务

计算机为先的思维,指令驱动机器器做事

容易易引⼊入⼤大量量状态变量量
• 函数式编程:

重视任务的解决(执⾏行行结果),关注数据转换和转换的组合

⼈人脑思维,任务驱动,分治

减少 side-effects,明确的输⼊入输出状态
Functional Programming
Source: https://medium.com/@cscalfani/so-you-want-to-be-
a-functional-programmer-part-1-1f15e387e536#.9utprtico
命令式 和 函数式
计算拥有身⾼高数据⽤用户的平均身⾼高
函数式编程能写出⼈人
类更更易易于理理解的程序
Source: https://maryrosecook.com/blog/post/a-practical-introduction-to-functional-programming
什什么是 RxJava
什什么是 RxJava - 概念
• Reactive eXtensions (ReactiveX) for the JVM
• 异步编程、事件驱动(数据流)编程
• ReactiveX 结合了了观察者模式、迭代器器模式和函数式编程的优点
什什么是 RxJava - 组成
• 做三件事
• 数据/事件的创建

create, from, just
• 组合、转换数据流

operators (map, flatMap, filter, merge, combineLatest, etc.)
• 监听处理理结果

subscribe
什什么是 RxJava - 特点
• 屏蔽实现细节
不不需要关⼼心是在同⼀一线程还是多个线程,是否⽤用了了线程池,要执⾏行行多久,等等。
只需要知道,未来的某个时间,它会在某个线程更更新数据给你。
什什么是 RxJava - 特点
• 统⼀一的数据更更新、异常处理理、取消、结束机制

onNext, onError, onComplete

链条中部发⽣生的错误会⼀一直传递到监听者

在链条的任何位置,你都可以处理理异常 (onErrorReturn,
onErrorResumeNext, retry)
• ⽅方便便的 Operators

debounce, timeout, groupBy, etc.
RxJava API
RxJava API - Overview
• Observable<T>: create, from, just

OnSubscribe<T>
• Observer<T>: onNext, onError, onComplete
• Subscriber<T>: implements Observer<T>, Subscription

Subscription

Operator<R, T>: Lifting Subscriber<T> to Subscriber<R>

http://reactivex.io/documentation/operators.html
• Subject<T>: Bridge between Observable<T> and Subscriber<T>
• Scheduler: Source of concurrency for observables.

(subscribe | observe) On
RxJava API - Observable
RxJava API - Observer
RxJava API - Operator
Source: http://reactivex.io/documentation/observable.html
RxJava API - Functional API
• Unfold: T -> Observable<T>

just, range, timer, interval, create, never, empty, error
• Map: Observable<T1> -> Observable<T2>

map, filter
• Fold (or reduce): Observable<T> -> T

reduce, toList
RxJava API - Cold vs Hot Observable
• 数据的产⽣生是依赖于 Observable 类型的
• “cold” Observable,其数据源是绑定在 Observable ⽣生命周期中的

数据源在有观察者时创建,观察者可以保证收到所有数据
• “hot” Observable,其数据源是脱离于 Observable 的

每次创建⼀一个新的 Observable,可能是从数据流的中间才开始观察

可⽤用于共享⼀一个数据源
• Subject always “hot”
Rx Extensions
Rx Extensions
• RxAndroid

https://github.com/ReactiveX/RxAndroid
• AndroidSchedulers.mainThread()

HandlerScheduler.from(Handler) *
• RxBinding

https://github.com/JakeWharton/RxBinding
• RxView.clicks()
* Latest API: AndroidSchedulers.from(Looper)
Rx Powered Libs
• RxLifecycle - Lifecycle handling APIs for Android apps using RxJava
• RxBinding - RxJava binding APIs for Android's UI widgets.
• SqlBrite - A lightweight wrapper around SQLiteOpenHelper and ContentResolver which introduces reactive stream semantics to queries.
• Android-ReactiveLocation - Library that wraps location play services API boilerplate with a reactive friendly API.
• rx-preferences - Reactive SharedPreferences for Android
• RxFit - Reactive Fitness API Library for Android
• RxWear - Reactive Wearable API Library for Android
• RxPermissions - Android runtime permissions powered by RxJava
• RxNotification - Easy way to register, remove and manage notifications using RxJava
• RxClipboard - RxJava binding APIs for Android clipboard.
Source: https://github.com/ReactiveX/RxAndroid/wiki
实际使⽤用的⼀一个例例⼦子
⼀一些坑
⼀一些坑 - 基本概念和⽤用法
• 理理解 RxJava 最关键的部分,就是理理解 RxJava 的流,包括流的源头
(Observable)、操作 (Operation)、和终点 (Subscription)。
• 流的初始化函数,只有在被订阅时,才会执⾏行行。流的操作,只有在有
数据传递过来时,才会进⾏行行,这⼀一切都是异步的。

(错误的理理解了了代码执⾏行行时机)
⼀一些坑 - Unsubscribe !
• cold observable 还好。如果是 hot observable,这会导致 memory leak,多次
注册等问题
• 好习惯是使⽤用⼀一个 SubscriptionList 将所有 subscription 都包装到⼀一起,
onDestroy 时⼀一次性 unsubscribe(管理理好流的⽣生命周期)
• SubscriptionList 在 unsubscribe 之后 add 进来的 Subscription ,都会执⾏行行
unsubscribe 。 所以,unsubscribe 之后,如果还想重新使⽤用这个list,需要new
⼀一个新的。
• 技巧:Subscriptions.create(Action),可以创建⼀一个在 unsubscribe 时执⾏行行的
Action。可以将某些API的注册、反注册写到⼀一块,让代码易易读
⼀一些坑 - 操作符 (Operators)
• 在没有弄弄清楚 Operator 的意思和影响前,不不要使⽤用它。
• ⼩小⼼心那些不不会 complete 的 observable 和收集类型的操作符

⽐比如reduce, toList, scan 等,必须等到Observable complete,才会返回
结果。

如果发现你的操作链条完全不不返回结果,看看是不不是在不不会 complete 的
observable 上使⽤用了了收集型的操作符
• distinctUntilChanged

可以过滤掉相同的元素。但注意不不要复⽤用数据,否则可能造成同⼀一个实例例
虽然被修改,但是由于是同⼀一个引⽤用,所以都被过滤掉了了。
⼀一些坑 - 线程、插件和其他
• RxJava ⼤大量量使⽤用异步。⽽而⼤大部分操作并不不会引⼊入线程。

数据源在哪个线程,就在那个线程执⾏行行。

⾮非特殊指定,OnSubscribe 在 subscribe 的线程执⾏行行。
• 尽量量使⽤用纯函数式编程(不不引⼊入 side effects,所有的数据,都只会通过函数的参数和返
回值来传递),这样的函数,⼏几乎可以随意的切换线程和并发。
• 如果有side effects,⼀一定要注意线程。⼤大部分的多线程由数据源引起。但也有部分线程
是因为某些操作符,⽐比如 timeout, debounce 等,所以,使⽤用⼀一个操作符前,也需要通
过⽂文档了了解它的⼯工作线程。
• Subject 不不是线程安全的,确保 onNext 都在⼀一个线程调⽤用。如需多线程,使⽤用
toSerialized() 将 subject 转变成线程安全的。
Tankery Chen
That’s all
Any Questions?
References
• ReactiveX

http://reactivex.io/

中⽂文翻译:https://mcxiaoke.gitbooks.io/rxdocs/content/
• 深⼊入浅出RxJava

基础篇:http://blog.csdn.net/lzyzsd/article/details/41833541

操作符:http://blog.csdn.net/lzyzsd/article/details/44094895

响应式的好处:http://blog.csdn.net/lzyzsd/article/details/44891933

在Android中使⽤用:http://blog.csdn.net/lzyzsd/article/details/45033611
• NotRxJava懒⼈人专⽤用指南(我们为什什么需要⼀一个RxJava)

http://www.devtf.cn/?p=323
• RxJava - introduction & design

http://www.slideshare.net/allegrotech/rxjava-introduction-context
• RxJava 的⼀一些坑

http://blog.tankery.me/development/intro-to-rxjava

More Related Content

Viewers also liked (11)

PDF
Rxjava meetup presentation
Guillaume Valverde
 
PPTX
Android architecture
Trong-An Bui
 
PDF
RxJava - introduction & design
allegro.tech
 
PPTX
大鱼架构演进
Jun Liu
 
PDF
Dependency injection
Yuki Matsumura
 
PDF
Docker home ted
Layne Peng
 
PDF
Java 8 Stream API and RxJava Comparison
José Paumard
 
PDF
認識那條鯨魚 Docker 初探
仲昀 王
 
PDF
Docker初识
hubugui
 
PPTX
快速上手 Windows Containers 容器技術 (Docker Taipei)
Will Huang
 
PDF
Docker 初探,實驗室中的運貨鯨
Ruoshi Ling
 
Rxjava meetup presentation
Guillaume Valverde
 
Android architecture
Trong-An Bui
 
RxJava - introduction & design
allegro.tech
 
大鱼架构演进
Jun Liu
 
Dependency injection
Yuki Matsumura
 
Docker home ted
Layne Peng
 
Java 8 Stream API and RxJava Comparison
José Paumard
 
認識那條鯨魚 Docker 初探
仲昀 王
 
Docker初识
hubugui
 
快速上手 Windows Containers 容器技術 (Docker Taipei)
Will Huang
 
Docker 初探,實驗室中的運貨鯨
Ruoshi Ling
 

使用 RxJava 让数据流动 (Let data streaming using rxjava)