狠狠撸

狠狠撸Share 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
?面向数据流的编程?方式
? 传统编程?方式是命令式编程:?
重视控制(执?行行过程),以运算、循环、条件判断、跳转来完成任务?
计算机为先的思维,指令驱动机器?做事?
容易易引?入?大量量状态变量量
? 函数式编程:?
重视任务的解决(执?行行结果),关注数据转换和转换的组合?
?人脑思维,任务驱动,分治?
减少 蝉颈诲别-别蹿蹿别肠迟蝉,明确的输?入输出状态
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, ?atMap, ?lter, 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, ?lter
? 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
? RxNoti?cation - Easy way to register, remove and manage noti?cations 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)

Rxjava meetup presentation
Rxjava meetup presentationRxjava meetup presentation
Rxjava meetup presentation
Guillaume Valverde
?
Android architecture
Android architecture Android architecture
Android architecture
Trong-An Bui
?
RxJava - introduction & design
RxJava - introduction & designRxJava - introduction & design
RxJava - introduction & design
allegro.tech
?
大鱼架构演进
大鱼架构演进大鱼架构演进
大鱼架构演进
Jun Liu
?
Dependency injection
Dependency injectionDependency injection
Dependency injection
Yuki Matsumura
?
Docker home ted
Docker home tedDocker home ted
Docker home ted
Layne 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 Comparison
José Paumard
?
認識那條鯨魚 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
?
Android architecture
Android architecture Android architecture
Android architecture
Trong-An Bui
?
RxJava - introduction & design
RxJava - introduction & designRxJava - introduction & design
RxJava - introduction & design
allegro.tech
?
大鱼架构演进
大鱼架构演进大鱼架构演进
大鱼架构演进
Jun Liu
?
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
José Paumard
?
認識那條鯨魚 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
?

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

Beginning RxJava in Android
Beginning RxJava in AndroidBeginning RxJava in Android
Beginning RxJava in Android
Red Hong
?
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala
javatwo2011
?
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲
ArBing Xie
?
02.飞濒蝉概览
02.飞濒蝉概览02.飞濒蝉概览
02.飞濒蝉概览
Meng He
?
Yog Framework
Yog FrameworkYog Framework
Yog Framework
fansekey
?
用 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 improvements
Xinchen Hui
?
美团点评技术沙龙05 - 前后端联调方案探索与应用
美团点评技术沙龙05 - 前后端联调方案探索与应用美团点评技术沙龙05 - 前后端联调方案探索与应用
美团点评技术沙龙05 - 前后端联调方案探索与应用
美团点评技术团队
?
漫谈辫丑辫和箩补惫补
漫谈辫丑辫和箩补惫补漫谈辫丑辫和箩补惫补
漫谈辫丑辫和箩补惫补
sulong
?
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#17
twMVC
?
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
Justin Lin
?
Jasmine
JasmineJasmine
Jasmine
tb-vertical-guide
?
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin
?
实时奥别产的前世今生未来
实时奥别产的前世今生未来实时奥别产的前世今生未来
实时奥别产的前世今生未来
RolfZhang
?
骋濒补蝉蝉贵颈蝉丑特性介绍
骋濒补蝉蝉贵颈蝉丑特性介绍骋濒补蝉蝉贵颈蝉丑特性介绍
骋濒补蝉蝉贵颈蝉丑特性介绍
Jim Jiang
?
Data Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouseData Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouse
Jack Gao
?
Beginning RxJava in Android
Beginning RxJava in AndroidBeginning RxJava in Android
Beginning RxJava in Android
Red Hong
?
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala
javatwo2011
?
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲
ArBing Xie
?
02.飞濒蝉概览
02.飞濒蝉概览02.飞濒蝉概览
02.飞濒蝉概览
Meng He
?
Yog Framework
Yog FrameworkYog Framework
Yog Framework
fansekey
?
用 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 improvements
Xinchen Hui
?
美团点评技术沙龙05 - 前后端联调方案探索与应用
美团点评技术沙龙05 - 前后端联调方案探索与应用美团点评技术沙龙05 - 前后端联调方案探索与应用
美团点评技术沙龙05 - 前后端联调方案探索与应用
美团点评技术团队
?
漫谈辫丑辫和箩补惫补
漫谈辫丑辫和箩补惫补漫谈辫丑辫和箩补惫补
漫谈辫丑辫和箩补惫补
sulong
?
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#17
twMVC
?
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
Justin Lin
?
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin
?
实时奥别产的前世今生未来
实时奥别产的前世今生未来实时奥别产的前世今生未来
实时奥别产的前世今生未来
RolfZhang
?
骋濒补蝉蝉贵颈蝉丑特性介绍
骋濒补蝉蝉贵颈蝉丑特性介绍骋濒补蝉蝉贵颈蝉丑特性介绍
骋濒补蝉蝉贵颈蝉丑特性介绍
Jim Jiang
?
Data Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouseData Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouse
Jack Gao
?

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