2、RxJava

2018-10-14  本文已影响17人  lesline

什么是RxJava

ReactiveX是Reactive Extensions的缩写,Rx 是微软.NET的一个响应式扩展。Rx借助可观测的序列提供一种简单的方式来创建异步的,基于事件驱动的程序。开发者可以使用Observables模拟异步数据流,使用LINQ语法查询Observables,并且很容易管理调度器的并发。
Netflix在2012年开始意识到他们的架构要满足他们庞大的用户群体已经变得步履维艰。为了实现这一目标,他们决定尝试响应式,开始将.NET Rx迁移到JVM上面。他们不想只基于Java语言;而是整个JVM,从而有可能为市场上的每一种基于JVM的语言:如Java、Closure、Groovy、Scala等等提供一种新的工具。

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

ReactiveX
译 ReactiveX 的理念和特点 - OPEN 开发经验库

观察者模型

观察者模式是出现的最常用的软件设计模式之一。它基于subject这个概念。subject是一种特殊对象,当它改变时,那些由它保存的一系列对象将会得到通知。而这一系列对象被称作Observers,它们会对外暴漏了一个通知方法,当subject状态发生变化时会调用的这个方法。

观察者模型.png

上面这张图展示了一个Subject为3个Observers提供服务。很明显,没有理由去限制Observers的数量:如果有需要,一个Subject可以有无限多个Observers,当subject状态发生变化时,这些Observers中的每一个都会收到通知。

JAVA设计模式之观察者模式 - 神仙果 - 博客园

RxJava概念

当我们异步执行一些复杂的事情,Java提供了传统的类,例如Thread、Future、FutureTask、CompletableFuture来处理这些问题。当复杂度提升,这些方案就会变得麻烦和难以维护。最糟糕的是,它们都不支持链式调用。
RxJava Observables被设计用来解决这些问题。它们灵活,且易于使用,也可以链式调用,并且可以作用于单个结果程序上,更有甚者,也可以作用于序列上。无论何时你想发射单个标量值,或者一连串值,甚至是无穷个数值流,你都可以使用Observable。
在RxJava的世界里,我们有四种角色:
Observable
Observer
Subscriber
Subjects
Observables和Subjects是两个“生产”实体,Observers和Subscribers是两个“消费”实体。

rxjava示例

rxjava1

        Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("Hello world");
                subscriber.onCompleted();
            }
        }).subscribe(new Observer<String>() {
            @Override
            public void onCompleted() {
                System.out.println("Complete");
            }

            @Override
            public void onError(Throwable e) {
                e.printStackTrace();
            }

            @Override
            public void onNext(String s) {
                System.out.println("Get:" + s);
            }
        });

rxjava2实现

        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 {
                System.out.println(s);
            }
        });

rxjava2简化版

Flowable.just("Hello world").subscribe(System.out::println);

rxjava2.png

热Observables和冷Observables

从发射物的角度来看,有两种不同的Observables:热的和冷的。一个”热”的Observable典型的只要一创建完就开始发射数据,因此所有后续订阅它的观察者可能从序列中间的某个位置开始接受数据(有一些数据错过了)。一个”冷”的Observable会一直等待,直到有观察者订阅它才开始发射数据,因此这个观察者可以确保会收到整个数据序列。


参考:

Rxjava:
Subject = Observable + Observer - RxJava Essentials 中文翻译版 - 极客学院Wiki
GitHub - ReactiveX/RxJava: RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.
RxJava 从入门到放弃再到不离不弃 | 戴定康的博客
RxJava深入 - 简书

RxjavaEssentials:
说明 · RxJava Essentials CN
RxJava开发精要2-为什么是Observables? - Leo的银弹 - 博客园
https://github.com/yuxingxin/RxJava-Essentials-CN
来到Java世界 - Netflix RxJava - RxJava Essentials 中文翻译版 - 极客学院Wiki

视频:
Transforming Observables(转换Observable),RxJava与RxAndroid基础入门教程-慕课网

实用实践:
给 Android 开发者的 RxJava 详解
这可能是最好的RxJava 2.x 入门教程(一) - 简书

书籍:
rxjava实战

上一篇下一篇

猜你喜欢

热点阅读