RxJava(一):介绍

博客主页java

1. 函数晌应式编程的概念

若是你曾经使用过 Java ,那么你 定据说过面向对象(OOP)的编程思想,也可能据说过 AOP ( Aspect Orient Programming ,面向切面编程)的编程思想。react

1.1 响应式编程( Reactive Programming ,简称 RP )

在计算机中,响应式编程是一种面向数据流和变化传播的编程范式。这意味着能够在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值经过数据流进行传播。程序员

传统的编程方式是顺序执行的,须要等待直至完成上一个任务以后才会执行下一个任务。不管是提高机器的性能仍是代码的性能,本质上都须要依赖上一个任务的完成。若是须要响应迅速,就得把同步执行的方式换成异步执行,方法执行变成消息发送。这就是异步编程的方式,它是响应式编程的重要特性之一。编程

响应式编程有如下几个特色:segmentfault

  1. 异步编程:提供了合适的异步编程模型,可以挖掘多核 CPU 的能力、提升效率、下降延迟和阻塞等。
  2. 数据流:基于数据流模型,响应式编程提供一套统一的 Stream 风格的数据处理接口。与 Java 中的 Stream 相比,响应式编程除了支持静态数据流,还支持动态数据流,而且容许复用和同时接入多个订阅者。
  3. 变化传播:简单来讲就是以一个数据流为输入,通过一连串操做转化为另外一个数据流,而后分发给各个订阅者的过程。这就有点像函数式编程中的组合函数,将多个函数串联起来,把一组输入数据转化为格式迥异的输出数据。

如今的 App 不管是原生 H5, HTML5 仍是 Hybird ,都会和与数据事件相关的 UI 事件进行大量的交互,使用响应式编程会显得更加驾轻就熟。安全

1.2 函数式编程( Functional Programming ,简称 FP)

随着硬件能力的不断提高,单核 CPU 计算能力几乎达到极限, CPU 己经进入了多核时代,程序员转而经过并发编程、分布式系统来应对愈来愈复杂的计算任务。数据结构

然而井发编程是基于内存共享,多线程编程有常见的死锁、线程饥饿、竞争条件等问题,并且多线程的 Bug 也难以重现和定位。多线程

在函数式编程中,因为数据是不可变的 immutable ),所以没有并发编程的问题,是线程安全的。它将计算机运算看做数学中函数的计算,主要特色是将计算过程分解成多个可复用的函数,而且避免了状态及变量的概念。架构

1.3 函数响应式编程( Functional Reactive Programming ,简称 FRP)

函数响应式编程结合了函数式和响应式的优势,把函数范式里的一套思路和响应式编程合起来就是函数响应式编程。并发

咱们知道,传统的面向对象编程是经过抽象出的对象关系来解决问题,函数式编程是经过函数(function)的组合来解决问题,响应式编程是经过函数式编程的方式来解决回调地狱(Callback Hell) 的问题。

用传统的面向对象来处理异步事件不是很直观,处理并发也十分麻烦,因此才产生了函数响应式编程。

2. RxJava 简介

2.1 RxJava 产生的由来

RxJava是Reactive Extensions Java 实现,用于经过使用 Observable/Flowable 序列来构建异步和基于事件的程序的库。

RxJava 扩展观察者模式以支持数据/事件序列,并添加容许你以声明方式组合序列的操做符,同时提取对低优先级的线程、同步、线程安全性和并发数据结构等问题的隐藏。

2.2 什么是 Rx

ReactiveX 是 Reactive Extensions 的缩写, 般简写为Rx,最初是 LINQ 个扩展,由微软架构师Erik.Meijer 领导的团队所开发,于 2012年11月开源。 Rx是一个编程模型,目标是提供一致的编程接口,帮助开发者更方便地处理异步数据流。Rx 库支持 .NET、JavaScript和C++。因为 Rx 近几年愈来愈流行,所以如今己经支持几乎所有的流行编程语言。 Rx的大部分语言库由 ReactiveX 这个组织负责维护,比较流行的有 RxJava RxJS Rx.NET ,社区网站是http://reactivex.io

2.3 ReactiveX 的历史

微软给的定义是, Rx是一个函数库,让开发者能够利用可观察序列和 LINQ 风格查询操做符来编写异步和基于事件的程序,经过使用Rx, 开发者能够用 Observables 表示异步数据流,用 LINQ 操做符查询异步数据流,用 Schedulers 参数化异步数据流的并发处理。能够这样定义
Rx: Rx= Observables + LINQ + Schedulers

注:在 RxJava 2.x 中, Observables 包含了 Observables、Flowable、Single、Maybe、Completable等

ReactiveX.io 给的定义是, Rx是一个使用可观察数据流进行异步编程的编程接口,ReactiveX 结合了观察者模式、 迭代器模式和函数式编程的精华。

2.4 Rx 模式

(1) 使用观察者模式

  • 建立: Rx 能够方便地建立事件流和数据流
  • 组合: Rx 使用查询式的操做符组合和变换数据流
  • 监听: Rx 能够订阅任何可观察的数据流并执行操做

(2) 简化代码

  • 函数式风格: 对可观察的数据流使用无反作用的输入/输出函数,避免了程序里错综复

杂的状态

  • 简化代码: Rx 操做符一般能够将复杂的难题简化为不多的几行代码
  • 异步错误处理: 传统的 try/catch 没办法处理异步计算, Rx 提供了合适的错误处理机制
  • 轻松使用井发: Rx的Observables (包括 Observable、Flowable、Single、Completable和Maybe )和 Schedulers 可让开发者摆脱底层的线程同步和各类并发问题

3. 为什么选择 RxJava

Rx 扩展了观察者模式用于支持数据和事件序列,添加了一些操做符,让你可使用声明式的方式来组合这些序列,而无须关注底层的实现,如线程、同步、线程安全、并发数据结构和非阻塞I/OI

Rx的Observable 模型让开发者能够像使用集合数据同样操做异步事件流,对异步事件流使用各类简单、可组合的操做。

  1. 可组合

对于单层的异步操做来讲,Java中的Future 对象的处理方式很是简单有效,可是一旦涉及嵌套,它们就开始变得异常烦琐和复杂。 在Java 8 以前,使用 Future 很难很好地组合带条件的异步执行流程。从另外一方面来讲, RxJava 的被观察者们(Observable/Flowable/Single/Completable/May)一开始就是为组合异步数据流准备的。

  1. 更灵活

RxJava 的 Observable 不只支持处理单独的标量值(就像 Future 能够作的〉,还支持数据序
列,甚至是无穷的数据流,Observable 个抽象概念,适用于任何场景。 Observable 拥有它的Iterable的所有优雅与灵活

  1. 无偏见

Rx 对于井发性或异步性没有任何特殊的偏好, Observable 能够用任何方式(如线程池、事件循环、非阻塞I/O、 Actor 模式)来知足咱们的需求。 不管咱们选择怎样实现它,不管底层实现是阻塞的仍是非阻塞的,客户端代码都将与 Observable 的所有交互当成是异步的。

4. RxJava 能作什么

在 Android 开发中哪些地方可使用 RxJava ?任何地方,包括 App 所依赖的底层框架。

例如,可使用 RxBinding ,它是对 Android View 事件的扩展,能够对 View 事件使用 RxJava
的各类操做。

对于 Android 的 AsyncTask ,也能够彻底使用 RxJava 来替代。

5. RxJava 2 的 Hello World

RxJava 版本的 Hello World

Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
        emitter.onNext("Hello World!");
    }
}).subscribe(new Consumer<String>() {
    @Override
    public void accept(String s) throws Exception {
        Log.d(TAG, "accept: " + s);
    }
});

这个写法比较长,能够简单一点的写法

Observable.just("Hello World!").subscribe(new Consumer<String>() {
    @Override
    public void accept(String s) throws Exception {
        Log.d(TAG, "accept: " + s);
    }
});

还能够借助 Lambda 表达式再简化

Observable.just("Hello World!").subscribe(System.out::println);

目前在移动端能够看到大量使用 RxJava 来编写的代码,也所以产生了大量的优秀框架,好比 RxBinding Retrofit RxLifecycle 等

若是个人文章对您有帮助,不妨点个赞鼓励一下(^_^)

相关文章
相关标签/搜索