RxJava 系列 (五)RxJava2 简介

概述

RxJava是响应式编程(Reactive Extensions)在JVM平台上的实现,即用java语言实现的一套基于观察者模式的异步编程接口,目前有1.x版本和2.x版本两套实现。RxJave2即RxJave库的2.x版本,这篇文章即介绍这个版本。

背景介绍

RxJava的1.x版本和2.x版本是不兼容的两个库,托管在不同分支上也使用不同的包名,官方指出1.x版本在2017年6月1日开始停止添加新内容,保持修改bug的状态,并在2018年3月31日停止开发。
RxJava的2.0.1版本于2016年11月12日正式发布,和1.x版本并行开发。RxJave2按照Reactive-Streams标准对接口进行了重写,继续支持java 6+和Android 2.3+,性能得到提升,更方便使用java8的lambda表达式,并把1.x中的背压功能单独分离出来。
在功能使用方面,2.x和1.x是大同小异的,大部分操作符都没变,实现原理也是相同的,所以下面会偏重介绍两个版本的不同点,关于RxJave的一些共性的基础的介绍可以参考本系列文章1.x版本部分。

简单使用

2.x版本的包名已经改变,maven库的gradle引用为:

compile 'io.reactivex.rxjava2:rxjava:x.y.z'

在1.x版本,被观察者的角色主要使用Observable,在2.x版本中增加了Flowable和Maybe,Flowable是2.x版本负责背压处理的被观察者,Observable中不再支持背压功能。
Flowable的简单使用代码如下:

Flowable flowable = Flowable.create(new FlowableOnSubscribe<Integer>() {
 
            @Override
            public void subscribe(FlowableEmitter<Integer> e) throws Exception {
                
                e.noNext(1);
                e.onNext(2);
                e.onNext(3);
                e.onComplete();

            }
        }, FlowableEmitter.BackpressureMode.BUFFER);

Disposable disposable = flowable
          .doOnNext(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                  Log.d("RX", integer.toString());
            }
          })
          .subscribe(new Subscriber<Integer>() {
            @Override
            public void onSubscribe(Subscription s) {
                s.request(Long.MAX_VALUE);//设置请求数,不设置默认也是这个数
            }
 
            @Override
            public void onNext(Integer integer) {
                 Log.d("RX", integer.toString());
            }
 
            @Override
            public void onError(Throwable t) {
                 Log.d("RX", t.toString());
            }
 
            @Override
            public void onComplete() {
                 Log.d("RX", "Complete");
            }
        });

我们可以看到create函数多了个参数,代表背压策略,背压策略后续会有文章详细讲解;subscribe函数的参数从Subscriber变成了FlowableEmitter;1.x版本的Action不见了,我们用的是Consumer;Subscriber其实也是用的Reactive-Streams规范中的Subscriber,比1.x多了onSubscribe函数,这个函数传入的参数Subscription是很重要的,必须调用它的request方法,下层才能收到事件通知,当然,为了使用方便,这个方法在框架中是有默认调用的,设置默认请求数为Long.MAX_VALUE。从1.x到2.x细节变化还是不少的,但总体来看,使用起来跟1.x还是差不多,用过1.x的应该可以很快适应。

Reactive-Streams简介

上面说到,2.x版本是根据Reactive-Streams实现的,所以再简单介绍下Reactive-Streams。

Reactive Streams是一个基于JVM的面向流的库包的标准和规范,具体如下:
1.处理潜在的无边界限制的元素
2.顺序
3.在组件之间异步传递元素
4.使用强制性的非堵塞的抗压。

Reactive Streams由以下部分组成:
SPI:定义了不同实现组件之间的交互层和互操作性
API:定义 Reactive Streams用户使用的类型
技术兼容Kit(TCK):实现的标准测试。

Reactive Streams是一个规范,构建系统的开发者们需要使用该规范的实现。Reactive Streams的目标是增加抽象层,而不是进行底层的流处理,规范将这些问题留给了库实现来解决。

具体使用Reactive Streams比较简单,只需实现几个接口即可,就像上面说的,Reactive Streams的目标是增加抽象层,而不是进行底层的流处理,每个具体流处理库可能都有自己的实现方式,但是只要大家都遵循了这个规范,那就可以无缝切换了。

Reactive Streams规范的一个主要目标是通过异步边界来解耦系统组件。在同步世界中,每个功能或是操作都是按照顺序处理的,一个接着一个;除了第一个外,其他每一个操作都依赖于前一个操作。这种方式增加了维护成本,并且不利于构建出响应式系统。

Reactive Streams规范的另一个主要目标是为压力处理定义一种模型。流处理的理想范式是将数据从发布者推送到订阅者,这样发布者就可以快速发布数据,同时通过压力处理来确保速度更快的发布者不会对速度较慢的订阅者造成过载。压力处理通过使用流控制来确保操作的稳定性并能实现优雅降级,从而提供弹性能力。

通过上面介绍,大家对Reactive Streams可能有了大概了解,这些大多是参考自一些权威写的文章,内容偏向整体的抽象概述,具体可以参考Reactive Streams的接口代码和实现规范的详情,这些都在GitHub中给出了。

2.x与1.x差异概述

一些差异前面已经有所提及,这里再总结一下:

  • maven地址和项目包名不同
  • RxJave2不再接受参数为null的数据流,这么做会马上抛出NullPointerException
  • Observable和Flowable分别处理无背压和有背压功能部分
  • 新增Maybe类型,可以看作Single和Completable的合体类
  • 完全遵循Reactive Streams接口规范
  • 方法都可以抛出异常
  • Action系列接口被Consumer取代
  • Func系列接口被重命名为Function系列
  • 调用Subscription的request方法时就会调用noNext等周期函数,所以要把一些后面需要用到的初始化操作放在request函数调用之前。
  • 少量操作符差异

更详细内容可以参考官网

参考文章:
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0907/6604.html
http://www.infoq.com/cn/news/2015/12/reactive-streams-introduction

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 概述 RxJava是响应式编程(Reactive Extensions)在JVM平台上的实现,即用java语言实现...
    lbhl阅读 1,038评论 0 0
  • RxJava2.0已经完全基于Reactive-Streams库重写,Reactive-Streams是从RxJa...
    mcivicm阅读 1,850评论 0 1
  • 前言 如果你对RxJava1.x还不是了解,可以参考下面文章。 1. RxJava使用介绍 【视频教程】2. Rx...
    jdsjlzx阅读 21,162评论 3 78
  • 不久前,去了一趟冥界,那真是一个天马行空的世界啊!听别人说冥界阴森恐怖、孤魂四散,这次亲自探访幽冥,我信了。怪不得...
    我是小代同学阅读 399评论 0 0