Rxjava小结

by hzwusibo  20190504


http://gank.io/post/560e15be2dca930e00da1083?from=timeline&isappinstalled=0#toc_1

RxJava :异步。

好在:  简洁。

RxJava 是通过一种扩展的观察者模式来实现异步的。

优雅的实现方法 - 基于事件流的链式调用

flatMap() 和 map() 有一个相同点:它也是把传入的参数转化之后返回另一个对象。但需要注意,和 map()不同的是, flatMap() 中返回的是个 Observable 对象,并且这个 Observable 对象并不是被直接发送到了 Subscriber 的回调方法中。

 flatMap() 的原理是这样的:

1. 使用传入的事件对象创建一个 Observable 对象;

2. 并不发送这个 Observable, 而是将它激活,于是它开始发送事件;

3. 每一个创建出来的 Observable 发送的事件,都被汇入同一个 Observable ,而这个 Observable 负责将这些事件统一交给 Subscriber 的回调方法。

这三个步骤,把事件拆成了两级,通过一组新创建的 Observable 将初始的对象『铺平』之后通过统一路径分发了下去。而这个『铺平』就是 flatMap() 所谓的 flat。

subscribeOn() 原理图

observeOn() 原理图:

从图中可以看出,subscribeOn() 和 observeOn() 都做了线程切换的工作(图中的 "schedule..." 部位)。不同的是, subscribeOn()的线程切换发生在 OnSubscribe 中,即在它通知上一级 OnSubscribe 时,这时事件还没有开始发送,因此 subscribeOn() 的线程控制可以从事件发出的开端就造成影响;而 observeOn() 的线程切换则发生在它内建的 Subscriber 中,即发生在它即将给下一级 Subscriber 发送事件时,因此 observeOn() 控制的是它后面的线程。

subscribeOn(): 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。 * observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。

io 和 newThread()区别:

Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。

行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。

不要把计算工作放在 io() 中,可以避免创建不必要的线程。

 lift原理:

在 Observable 执行了 lift(Operator) 方法之后,会返回一个新的 Observable,这个新的 Observable 会像一个代理一样,负责接收原始的 Observable 发出的事件,并在处理后发送给 Subscriber。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转一篇文章 原地址:http://gank.io/post/560e15be2dca930e00da1083 前言...
    jack_hong阅读 4,457评论 0 2
  • 文章转自:http://gank.io/post/560e15be2dca930e00da1083作者:扔物线在正...
    xpengb阅读 11,878评论 9 73
  • 白雪皑皑映着月光,屋前的空地上是一串连着的脚印,映着那离别人的痕迹。 一身红衣矗立在门前,看着雪花飘落,遥望远方,...
    钟离凌羽阅读 3,437评论 0 0
  • 天气越来越热,人的心情越来越烦躁,每天面对的事情太多太多,需要解决的事情也很多,内心有时候也很疲惫,却不得不强大自...
    懿轩妈咪阅读 1,579评论 0 1
  • 第十七章 崩坏·其二 见过太太,老爷便带着小磊进了一个房间。 小磊刚刚进入房间,老爷便一脚将他踹倒在地:“给我放聪...
    2cm阅读 1,625评论 0 0