Android - thirdlib - RxJava

关键字

同步,异步,事件流,上游,下游,线程调度,操作符,背压,Hot/Cold Observable(电台/CD)

1. 优缺点

1.1 优点:

  1. 响应式编程,被观察者主动拿到数据传递给观察者,解耦
  2. 链式调用,随着逻辑变复杂,代码结构依然简洁
  3. 线程任意切换,不限次数
  4. 强大的操作符功能

1.2 缺点:

  1. 操作符群强大,内部基本实现日常需求的功能,我们可能不认识或者不会组合

1.3 区别对比:

同步没有争议;

异步情况:

  1. Callback/Listener Hell
  2. Future<Future<T>>
  3. Observable 默认按异步处理,下游不关心上游事件的处理

2. 观察者模式

普通的生产者消费者模式,面向 Callback 编程

生产者 --Callback--> 消费者

取消订阅:在事件生产层完成

RxJava模式

生产者 -> RxJava Operators -> 消费者

  1. RxJava 取代了 Callback
  2. RxJava 对生产者的事件进行重新组织,进行“预处理”
  3. 消费者这一层代码变轻,RxJava 取代 Callback 这一层代码变厚

取消订阅:下放到观察者这层,实现了彻底解耦

3. Rx2.0 新特性

Observable -> Observer 不支持背压 Backpressure

Flowable -> Subscriber 支持背压

四个新增核心 API:PublisherSubscriberSubscriptionProcessor

五种事件类型

  1. Observable
  2. Single
  3. Maybe
  4. Completable
  5. Flowable 支持背压

发送事件:ObservableEmitter

管理时间:Disposable 可支配的 / CompositeDisposable

其他:

  1. Subject
  2. RxJavaPlugins

4. 线程调度

.subscribeOn():指定上游,第一次有效

.observeOn():指定下游,多次有效,使用一次下游切换一次

几种线程:

Schedules.io() / .computation() / .newThread() / .single() / .trampoline() / .from(Executor)

AndroidSchedule.main()

5. 背压

BackPressure 上游发送事件的快慢,上下游流速不均衡
同步:同一线程,下游接收完毕 然后上游才发送
异步:不同线程,任意发送

Flowable
区分:

  1. 多了一个被压策略参数
  2. Disposable -> Subscription
  3. Observer -> Subscriber
  4. Subscription.request() 响应式拉取

同步:不调用request认为下游没有处理事件的能力,抛MissBackpressureException

异步:可以不调用,默认有一个128存储buffer,超过128抛异常,

背压策略 BackpressureStrategy

  1. ERROR:128
  2. BUFFER:不限
  3. DROP:存不下的丢弃
  4. LASTEST:只保留最新的

上游获取下游处理事件能力:FlowableEmitter.requested()

6. 操作符

注意,实现使用都用对象操作,而不是简单的数字

顺序操作符 描述
.startWith() 之前操作
.doOnNext() 之后操作
类时间操作符 描述 举例
.debounce() 去抖动,去除发送频率过快的事件 -
.distinc() 去重 -
.filter() 过滤 -
.sample() 采样 -
.last() 最后 -
.timer() 定时任务,默认在新线程 -
.interval() 间隔任务,默认在新线程,注意销毁 -
.skip() 跳过 (1, 2, 3, 4) -- .skip(2) --> (3, 4)
.take() 接收几个事件 (1, 2, 3, 4) -- .take(2) --> (1, 2)
组合变换操作符 描述 举例
.compose() 配合 ObservableTransformer -
.map() 一对一 -
.flatMap() 一对多,无序 -
.concatMap() 一对多,有序 -
.zip() 多对一,有序,合并以最少的事件队列为准,注意在一个线程(没有切换线程)时会出现水管1先发送,然后再发送水管2的,因为是单线程。 log: 1,2,3,A,1A,B,2B,C,3C
.concat() 连接,A 调用了onComplete才会执行下一个 B -
.merge() 组合,根据事件发送时间 A B 交叉组合,不用等A发送完毕 -
.buffer() :Observable<List<T>> - (1, 2, 3, 4, 5, 6) --.buffer(3,2)--> (123,345,5)
.window() :Observable<Observable<T>> - -
.reduce() 简化 (1, 2, 3) --.reduce((a, b) -> a + b) --> 6
.scan() (1, 2, 3) --.scan((a, b) -> a + b) --> 1,3,6

7. 应用场景

7.1 空间维度

场景 1:页面先加载缓存后加载网络

.startWith

.distinct

场景 2:页面加载多个接口加载视图

.map

.flatMap

.collectInto

.combieLatest

7.2 时间维度

场景 1:点击事件防抖动

.debounce

场景 2:社交软件点赞和取消点赞

频繁点击增加服务器压力

优化点:

  1. 防抖动
  2. 连续点击 2 下无效情况

场景 3:搜索提示

考虑点:

  1. 防抖动
  2. 多次请求,返回结果的顺序问题,1. 展示最后一次请求 2. 取消之前的请求

.switchMap

参考资料

RxJava 沉思录系列

拥抱RxJava 系列:关于Observable的冷热,常见的封装方式以及误区

给初学者的RxJava2.0教程系列

这可能是最好的RxJava 2.x 系列

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249