SlideShare uma empresa Scribd logo
1 de 32
Baixar para ler offline
使⽤用 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

Mais conteúdo relacionado

Destaque

Android architecture
Android architecture Android architecture
Android architecture Trong-An Bui
 
RxJava - introduction & design
RxJava - introduction & designRxJava - introduction & design
RxJava - introduction & designallegro.tech
 
大鱼架构演进
大鱼架构演进大鱼架构演进
大鱼架构演进Jun Liu
 
Docker home ted
Docker home tedDocker home ted
Docker home tedLayne Peng
 
Java 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava ComparisonJava 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava ComparisonJosé Paumard
 
認識那條鯨魚 Docker 初探
認識那條鯨魚   Docker 初探認識那條鯨魚   Docker 初探
認識那條鯨魚 Docker 初探仲昀 王
 
Docker初识
Docker初识Docker初识
Docker初识hubugui
 
快速上手 Windows Containers 容器技術 (Docker Taipei)
快速上手 Windows Containers 容器技術 (Docker Taipei)快速上手 Windows Containers 容器技術 (Docker Taipei)
快速上手 Windows Containers 容器技術 (Docker Taipei)Will Huang
 
Docker 初探,實驗室中的運貨鯨
Docker 初探,實驗室中的運貨鯨Docker 初探,實驗室中的運貨鯨
Docker 初探,實驗室中的運貨鯨Ruoshi Ling
 

Destaque (11)

Rxjava meetup presentation
Rxjava meetup presentationRxjava meetup presentation
Rxjava meetup presentation
 
Android architecture
Android architecture Android architecture
Android architecture
 
RxJava - introduction & design
RxJava - introduction & designRxJava - introduction & design
RxJava - introduction & design
 
大鱼架构演进
大鱼架构演进大鱼架构演进
大鱼架构演进
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Docker home ted
Docker home tedDocker home ted
Docker home ted
 
Java 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava ComparisonJava 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava Comparison
 
認識那條鯨魚 Docker 初探
認識那條鯨魚   Docker 初探認識那條鯨魚   Docker 初探
認識那條鯨魚 Docker 初探
 
Docker初识
Docker初识Docker初识
Docker初识
 
快速上手 Windows Containers 容器技術 (Docker Taipei)
快速上手 Windows Containers 容器技術 (Docker Taipei)快速上手 Windows Containers 容器技術 (Docker Taipei)
快速上手 Windows Containers 容器技術 (Docker Taipei)
 
Docker 初探,實驗室中的運貨鯨
Docker 初探,實驗室中的運貨鯨Docker 初探,實驗室中的運貨鯨
Docker 初探,實驗室中的運貨鯨
 

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

Beginning RxJava in Android
Beginning RxJava in AndroidBeginning RxJava in Android
Beginning RxJava in AndroidRed Hong
 
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scalajavatwo2011
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲ArBing Xie
 
02.wls概览
02.wls概览02.wls概览
02.wls概览Meng He
 
Yog Framework
Yog FrameworkYog Framework
Yog Frameworkfansekey
 
用 Ruby 開發 IoT 應用 - 以 RubyConf.tw 打卡系統為例
用 Ruby 開發 IoT 應用 - 以 RubyConf.tw 打卡系統為例用 Ruby 開發 IoT 應用 - 以 RubyConf.tw 打卡系統為例
用 Ruby 開發 IoT 應用 - 以 RubyConf.tw 打卡系統為例亮齊 曾
 
⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨Wen-Tien Chang
 
Weibo lamp improvements
Weibo lamp improvementsWeibo lamp improvements
Weibo lamp improvementsXinchen Hui
 
美团点评技术沙龙05 - 前后端联调方案探索与应用
美团点评技术沙龙05 - 前后端联调方案探索与应用美团点评技术沙龙05 - 前后端联调方案探索与应用
美团点评技术沙龙05 - 前后端联调方案探索与应用美团点评技术团队
 
漫谈php和java
漫谈php和java漫谈php和java
漫谈php和javasulong
 
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發LaravelConf Taiwan 2017 單頁面應用與前後端分離開發
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發俊仁 陳
 
Cgroup lxc在17173 iaas应用池中应用
Cgroup lxc在17173 iaas应用池中应用Cgroup lxc在17173 iaas应用池中应用
Cgroup lxc在17173 iaas应用池中应用Jinrong Ye
 
Angular js twmvc#17
Angular js twmvc#17Angular js twmvc#17
Angular js twmvc#17twMVC
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7Justin Lin
 
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫Justin Lin
 
实时Web的前世今生未来
实时Web的前世今生未来实时Web的前世今生未来
实时Web的前世今生未来RolfZhang
 
GlassFish特性介绍
GlassFish特性介绍GlassFish特性介绍
GlassFish特性介绍Jim Jiang
 
Data Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouseData Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouseJack Gao
 

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

Beginning RxJava in Android
Beginning RxJava in AndroidBeginning RxJava in Android
Beginning RxJava in Android
 
Ali-tomcat
Ali-tomcatAli-tomcat
Ali-tomcat
 
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲
 
02.wls概览
02.wls概览02.wls概览
02.wls概览
 
Yog Framework
Yog FrameworkYog Framework
Yog Framework
 
用 Ruby 開發 IoT 應用 - 以 RubyConf.tw 打卡系統為例
用 Ruby 開發 IoT 應用 - 以 RubyConf.tw 打卡系統為例用 Ruby 開發 IoT 應用 - 以 RubyConf.tw 打卡系統為例
用 Ruby 開發 IoT 應用 - 以 RubyConf.tw 打卡系統為例
 
⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨
 
Weibo lamp improvements
Weibo lamp improvementsWeibo lamp improvements
Weibo lamp improvements
 
美团点评技术沙龙05 - 前后端联调方案探索与应用
美团点评技术沙龙05 - 前后端联调方案探索与应用美团点评技术沙龙05 - 前后端联调方案探索与应用
美团点评技术沙龙05 - 前后端联调方案探索与应用
 
漫谈php和java
漫谈php和java漫谈php和java
漫谈php和java
 
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發LaravelConf Taiwan 2017 單頁面應用與前後端分離開發
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發
 
Cgroup lxc在17173 iaas应用池中应用
Cgroup lxc在17173 iaas应用池中应用Cgroup lxc在17173 iaas应用池中应用
Cgroup lxc在17173 iaas应用池中应用
 
Angular js twmvc#17
Angular js twmvc#17Angular js twmvc#17
Angular js twmvc#17
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
 
Jasmine
JasmineJasmine
Jasmine
 
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
 
实时Web的前世今生未来
实时Web的前世今生未来实时Web的前世今生未来
实时Web的前世今生未来
 
GlassFish特性介绍
GlassFish特性介绍GlassFish特性介绍
GlassFish特性介绍
 
Data Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouseData Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouse
 

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