Maxiee 的 RxJava 学习指南 (1)

第一印象

我初学 RxJava (ReactiveX) 的时候, 常常会感到困惑.

有时会感到很容易:

创建一个被观察者, 再创建一个观察者, 后者观察一下前者, 就能收到前者发出的数据. 这么一个简单的观察者模式是很容易理解的, 很多入门的教程里面也确实是这么写的.

这种容易会让我们困惑, 这种玩具代码在实际应用中没什么用处, 而且据我们所知, RxJava 的能力是非常强大的, 绝对没有这么简单.

有时会感到很困难:

当开始学习操作符时, 才发现原来有这么多的操作符. 感觉这已经不是在学习一个库, 而是在学习一套新的编程语言.

如此多的操作符, 它们的应用场景是什么? 它们之间如何建立联系? 能够成哪些架构模式呢?

对于这些问题, 都没有答案, 因此觉得要想用好它很困难.

这个东东很复杂:

前面的感觉让我认识到, 所要学习的事物是比较复杂的.

RxJava 的背后是一整套 ReactiveX 的编程思想和特定的编程语言.

因此我按照学习一门新语言的准备来学习它.

ReactiveX 官网

首页

学习一个事物最首要的资源是它的官方资源. 由于 RxJava 是 ReactiveX 的一种针对 Java 的特定实现, 因此首要学习的是 ReactiveX 官网.

网站导航栏里设有以下项目:

项目 说明
Introduction ReactiveX 的官方介绍. 什么是 ReactiveX, 它跟观察者模式有什么异同, 它是怎么解决异步问题的, 什么是被观察者, 什么是 Reactive Programming, 都进行了介绍.
Docss 文档, 是最终要的部分, 各个重要概念都在这里给出. 这一部分要吃透.
Languages ReactiveX 针对各种语言的实现, RxJava 是其中的一种.
Resources 下设一个 Tutorials, 收集了一些教程, 也是重要的学习资源.
Community 社区的一些联系方式.

Docs

看完 Introduction, 接下来就开始学习 Docs 里面的详细文档. 一共包含五篇文章: Observable, Operators, Single, Subject, Scheduler.

一篇文章对应一个主题, 它们是 ReactiveX 最核心的要素, 因此每篇都要吃透.

分别简单地介绍一下.

Docs - Observable

介绍 ReactiveX 最基本的概念:

  • 引入弹珠图, 这种图该怎么看
  • 被观察者, 观察者, 观察者订阅被观察者, 被观察者对外发出数据
  • 被观察者分为冷热两种
  • 被观察者可以跟操作符进行链式组合, 并给出了所有操作符

这里需要注意的是:

  1. 弹珠图, 要学会看弹珠图
  2. 最后虽然列出了操作符, 在 Operators 会有更详细的列举

Docs - Operators

介绍操作符的的基本概念.

操作符一共分为 11 类:

  1. 创建被观察者 Creating Observables
  2. 变换被观察者 Transforming Observables
  3. 过滤被观察者 Filtering Observables
  4. 组合被观察者 Combining Observables
  5. 错误处理操作符 Error Handling Operators
  6. 被观察者工具操作符 Observable Utility Operators
  7. 条件和布尔操作符 Conditional and Boolean Operators
  8. 数学和聚合操作符 Mathematical and Aggregate Operators
  9. 背压操作符 Backpressure Operators
  10. 可连接的被观察者操作符 Connectable Observable Operators
  11. 转换被观察者的操作符 Operators to Convert Observables

看到这么多操作符, 我的第一反应是肯定不能把这些一个一个看完了再编程, 还是得去找点开源项目, 根据 2/8 法则, 先把最重要的点 Get 到.

文档后面的 A Decision Tree of Observable Operators 一节给出了一个决策树, 还给了一篇教程 Which Operator do I use?.

Docs - Single

RxJava (以及它的变体 RxGroovy 和 RxScala) 实现了一种被观察者的变体, 叫做 Single.

文档中首先介绍了它跟 Observable 的异同.

之后对应用于 Single d的各种操作符进行介绍.

看过这个我有一点疑问, 就是既然都有 Observable, 为何要再实现一个差不多的 Single 呢? 其背后一定有什么场景, 它是什么呢?

Docs - Subject

Subject 是一种类似于桥梁或者代理, 它既充当被观察者的角色, 也充当观察者的角色.

Subject 有 4 种, 文档里逐一做了介绍.

4 种 Subject 的工作机制并不难理解, 但我最大的问题还是不知道应用场景是什么, 设计的背景是什么.

Docs - Scheduler

ReactiveX 的链式操作可以切换线程, 这个特性非常棒.

主要通过两个操作符实现:

  • subsribeOn 改变被观察者在哪个调度器上执行任务
  • observeOn 改变被观察者在那个调度器上发通知

这里面具体有一些规则的细节:

  • subscribeOn 出现的顺序位置没有关系, 只要指定了 subscribeOn, 那么被观察者就在它指定的线程上运行
  • 在整个链条中 subscribeOn 只调用一次
  • observeOn 可以多次调用, 每调用一次, 链条下游的就切换一次线程

总结

至此, 就完成了首页的文档部分的学习.

到目前为止, 算是知道了一些 RxJava (ReactiveX) 的基本概念, 但是他们怎么用? 在什么场景下用? 如何融合到架构中? 这些问题都停留在我的心中.

由于这些问题没有解决, RxJava (ReactiveX) 的基本概念都是空中楼阁, 都是虚的概念.

因此, 下一步, 我打算通过学习实际的项目, 来真正理解这些概念.

打赏

如果这篇文章对您有所帮助, 欢迎扫描下面微信二维码请我喝杯可乐~

您的打赏将会极大提高我的写作热情, 激励我更新更多更好的博客.

103ED89B-4DCA-450E-9E42-FE5A1129A03D