type
status
date
slug
summary
tags
category
icon
password
前言
RxJava 是 NetFlix 出品的 Java 框架,RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。
RxJava 在 Android 中一个典型的使用示范如下:
RxJava 的核心是简化开发,因为它提高了围绕线程的抽象级别。也就是说,作为开发人员,您不必担心如何执行应该在不同线程上进行的操作的细节。这是特别有吸引力的,因为线程难以正确实现,如果执行不正确,可能会导致一些最困难的错误进行调试和修复。当然,这并不意味着 RxJava 在线程化方面是防弹的,了解幕后发生的事情仍然很重要。但是,RxJava 绝对可以使您的生活更轻松。
RxJava vs AsyncTask
假设我们要通过网络获取数据并更新 UI,AsyncTask 示例如下:
相比之下,执行网络调用的RxJava方法可能看起来像这样:
Android 创造的
AsyncTask
,其实都是为了让异步代码更加简洁。RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。Observable, Observer 和 Operator
在RxJava世界中,所有内容都可以建模为流。流随着时间的流逝发射项目,并且每次发射都可以消耗/观察
流的抽象是通过3个核心结构实现的,我将其称为“ 3 O”。即:可观察者,观察者和操作者。 Observable发出项目(流);观察者消耗这些物品。可观察对象的发射可以通过链接操作员调用来进一步修改,转换和操纵。
Observable
一个 Observable 是 RxJava 中的流抽象。它与 Iterator 相似,在给定序列的情况下,它会按顺序进行迭代并生成这些项。然后,消费者可以通过相同的界面消费这些物品,而不管其基础顺序如何。
在 ReactiveX 中,观察者订阅了一个 Observable。然后,该观察者对可观察对象发出的任何项目或项目序列做出反应。这种模式有助于并发操作,因为它在等待 Observable 发出对象时不需要阻塞,而是以观察者的形式创建了一个哨兵,随时准备在 Observable 以后的任何时间做出适当的反应。(例如用 RxJava 实现的 RxBus)
Observable 有很多种创建方式(Creating Observables), 常用创建方法:
Observable 支持发送 Action、Callable、Future 等任务
Observer
Observable 流的下一个组件是已预订的 Observer(一个或多个 Observer)。每当流中发生“有趣”的事情时,便会通知观察者。通过以下事件通知观察者。
Observer#onNext(T)
- 从流中发出项目时调用
Observable#onError(Throwable)
-流中发生错误时调用
Observable#onCompleted()
- 当流完成发送项目时调用
要订阅流,只需调用 Observable#subscribe(...) 并传入一个 Observer 实例即可
在 JVM 中,需要操作取消订阅避免内存泄漏。
Operator
Observable 发出的项目可以在通知订阅的 Observer 对象之前通过运算符进行转换,修改和过滤。在函数式编程中发现的一些最常见的操作(例如,map, filter, reduce,filter 等)也可以应用于可观察流。
线程调度
线程调度原理
参考 一张图看懂 Rxjava 的原理 这篇博客,从构建流、订阅流、观察者回调流三个方面讲述 RxJava 线程调度原理,深入浅出。学习技术原理,怎么读源码,这篇博客提供一个很好模版。