自从06年开始,Rxandroid公司项目中陆续就开始使用它了,而它的基础是由Rxjava演变过来的,如今它也是越来越被广泛使用在商业项目中了,而做为"专业"的自己还是一直对它一知半解,而在实现功能时首先并不会想到用它去架构代码,而是还是想用着传统的方式,并不是不想用它,而是对它的使用不太了解有点抗拒,所以接下来准备系统的学下它,以便在未来如果项目中用了Rx相关的东东不至于太陌生,同时也为了自己将来在做项目时能很好的应用它。

在学习一门新技术之前首先得对它有一个大概的认识,也就是理论这方面肯定是少不了的,下面开始!

什么是Rx?

  • ReactiveX是Reactive Extensions的缩写,一般简写为Rx,由微软的架构师Erik Meijer领导的团队开发,在2012年11月开源。
  • Rx是一个编程模型,目标是提供一致的编程接口,帮助开发者更方便的处理异步数据,目前Rx支付大部分流行的编程语言,比如Java、C#、PHP等。
  • Rx是一函数库,让开发者可以利用可观察序列和LINQ风格查询操作符来编写异步和基于事件的程序。
  • 可以这样定义:Rx = Oberservables + LNIQ + Schedules。
  • ReactiveX不仅仅是编程接口,更是一种编程思想的突破,Rx还影响了其它的程序库、框架以及编程语言。

Rx模式--观察者模式

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

Rx优点--简洁

  • 函数式风格:Rx可以方便的创建事件流和数据流。
  • 简化代码:Rx操作符可以将复杂的逻辑简化为很少的几行代码。
  • 异步错误处理机制:传统的try/catch没办法处理异步计算,Rx提供了合适的错误处理机制。
  • 轻松使用开发:Rx的Observables和Schedulers让开发者可以避免底层线程同步和各种并发问题。

【注】:有些理论可以参考博文:http://blog.csdn.net/u010046908/article/details/50942247

什么是Rxjava?【主题】

Rxjava是ReactiveX在JVM上的一个实现,也就是说Rxjava是用java语言实现的响应式编程,来创建基于事件的异步程序。

提升开发效率,降低维护成本一直是开发团队永恒不变的宗旨,近一年来国内的技术圈子中越来越多开始提及Rxjava,学习和掌握Rxjava已经很有必要。Rxjava能够帮助我们简化代码逻辑,提升代码可读性,这对于提升开发效率,降低后期维护成本很有帮助。

Rxjava正在Android开发中也变得越来越流行【俗称的RxAndroid,这个在我们公司的项目中就已经大量使用到了】,唯一的问题就是上手不容易,尤其我们都对传统的命令式编程比较熟,但是!!只要弄明白了,会发现使用Rxjava真的是太棒了,所以有必要好好学习下它。

学习Rxjava

响应式编程的主要组成部份是observable、operator和subscriber。一般响应式编程的信息流如下所示:

  Observable -> Operator1 ->  Operator2 -> Operator3 -> Subscriber

其中Observable是事件的生产者,Subscriber是事件最终的消费者,而其数据的转换由一系列的Operator操作符来执行。

:因为Subscriber通常是在主线程中执行,因此设计上要求其代码尽可能简单,只对事件做出响应(不对事件或者数据进行修改),而修改事件的工作完全由operator来执行。

有了上面的一大堆理论基础之后,下面用代码来直观的感受一下Rxjava的魅力,编写一个Hello World!,这里采用eclipse中的j2se项目来进行学习,因为还木有用到Android相关的东东,脱离开测试比较方便高效。

在正式写代码之前,首先得在网上下一个Rxjava的jar包,Rxjava如今最新版是2.x,但是要学习还得先从1.x开始,所以这里网上下载Rxjava1.3.0,如下:

下载完之后,新建工程,并将其引入到工程中,接下来就可以开始我们的Hello World啦!!先直观感受下,不必深纠~

public class RxHelloWorld {

    public static void main(String[] args) {
testObservable();
} @SuppressWarnings("deprecation")
private static void testObservable() {
// 创建被观察者Observable
Observable<String> observable = Observable
.create(new OnSubscribe<String>() { @Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello World!");
subscriber.onCompleted();
}
});
// 创建观察者Observer
Observer<String> observer = new Observer<String>() { @Override
public void onCompleted() {
System.out.println("observer onCompleted()");
} @Override
public void onError(Throwable e) {
// TODO Auto-generated method stub } @Override
public void onNext(String t) {
System.out.println("observer onNext():" + t);
}
};
// 被观察者订阅(subscribe)观察者
observable.subscribe(observer); } }

编译运行:

可以看出消息是由被观察者Observable发出,由观察者Observer进行消息处理。那如果说发送"Hello World!"时后面要再加一些字符,可以这样修改代码:

其结果肯定如预期:

但是!上面的这个做法不符合Rxjava的思想,这是因为它不希望"在产生数据的地方修改数据",所以可以想到第二种方法,如下:

其结果很显然也是一样的被改变,但是!!!这还是不符合Rxjava的编程思想,那如果要改变一个数据,应该用它的哪种方式呢?答案揭晓---利用Rxjava的操作符来改变数据流,如何做呢?看下面:

@SuppressWarnings("deprecation")
private static void testObservable() {
// 创建被观察者Observable
Observable<String> observable = Observable
.create(new OnSubscribe<String>() { @Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello World!");
subscriber.onCompleted();
}
});
// 创建观察者Observer
Observer<String> observer = new Observer<String>() { @Override
public void onCompleted() {
System.out.println("observer onCompleted()");
} @Override
public void onError(Throwable e) {
// TODO Auto-generated method stub } @Override
public void onNext(String t) {
System.out.println("observer onNext():" + t);
}
};
// 被观察者订阅(subscribe)观察者
observable
.map(new Func1<String, String>() {//利用map操作符对数据进行修改 @Override
public String call(String t) {
return t + "cexo";
}
})
.subscribe(observer); }

其中的Func1这是个什么东东,好诡异好生涩的样子,这里先只从它的源码有个初步的认识,之后会具体去理解为啥要这样写的:

一个接口声明,先不去过多的理解为啥要这么声明,光从这个代码来看就是做一个类型的转换工作,正好是符合map操作符的意义,了解下既可。

再编译运行:

结果一样,一个这么简单的例子要用多种方式来达到相同的功能,主要是为了说明Rxjava的一种思想,可见跟正常的思路还是不太一样的。

另外这里提到了一个map操作符的概念,可以上官网去瞅一眼:

官网看着还挺漂亮的,看下官网提供的有哪些东东:

可以看到已经有好多语方的版本了,其中第一位就看到了Rxjava啦,接着再看:

这五大东东实际上就是Rxjava的核心,先有个感观上的认识,之会会慢慢去学它们的,那我们关心的操作符就列在第二位:

点开看一下,貌似好多种类,下面大致看一下:

是不是有点晕了,不用太过着急,之后会一点点去学的,有个大概的认识就成。

在官网主页上,看到有这么一个动图:

其中说的是debounce操作符,下面可以点击看一下它的具体介绍:

debounce是过滤操作符中的一种,至于它干嘛用的这里先不用操心,未来会学到的,对于上面这么形象的图有没有想像它是一个动态的图,实际就是动态的:

可见其官网做得是比较好的,另外可以链接到它的Github的官网上来:

打开之后就可以看到有各种相关的项目,其中就可以找到我们的Rxjava啦:

点击进去:

那既然Rxjava1.x最终就要淘汰掉了,那还有必要从Rxjava1.x学起么?很有必要!!!因为2.x就是由1.x演变过来的,核心的东西是没有变的,而且大部份都是1.x的东东,所以把1.x学好了,就可以很平滑快速的过渡到2.x上来,所以这点要坚信!!

RxJava——响应式编程的更多相关文章

  1. RxJava响应式编程,入门的HelloWorld;

    RxJava核心就是异步,它也被称之为响应式编程:最大的优势就是随着程序逻辑变得越来越复杂,它依然能够保持简洁. Rxjava真的是让人又爱又恨,因为它的线程切换和链式调用真的很好用,但是入门却有点难 ...

  2. RxJava(一):响应式编程与Rx

    一,响应式编程 响应式编程是一种关注于数据流(data streams)和变化传递(propagation of change)的异步编程方式. 1.1 异步编程 传统的编程方式是顺序执行的,必须在完 ...

  3. 响应式编程库RxJava初探

    引子 在读 Hystrix 源码时,发现一些奇特的写法.稍作搜索,知道使用了最新流行的响应式编程库RxJava.那么响应式编程究竟是怎样的呢? 本文对响应式编程及 RxJava 库作一个初步的探索. ...

  4. iOS开发--Swift RAC响应式编程初探

    时间不是很充足, 先少说点, RAC的好处是响应式编程, 不需要自己去设置代理委托, target, 而是主要以信息流(signal), block为主, 看到这里激动吧, 它可以帮你监听你的事件, ...

  5. iOS响应式编程:ReactiveCocoa vs RxSwift 选谁好

    转载: iOS响应式编程:ReactiveCocoa vs RxSwift 选谁好 内容来自stack overflow的一个回答:ReactiveCocoa vs RxSwift – pros an ...

  6. (转)Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门

    http://www.ityouknow.com/springboot/2019/02/12/spring-boot-webflux.html Spring 5.0 中发布了重量级组件 Webflux ...

  7. Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门

    Spring 5.0 中发布了重量级组件 Webflux,拉起了响应式编程的规模使用序幕. WebFlux 使用的场景是异步非阻塞的,使用 Webflux 作为系统解决方案,在大多数场景下可以提高系统 ...

  8. 【SpringBoot】SpringBoot2.0响应式编程

    ========================15.高级篇幅之SpringBoot2.0响应式编程 ================================ 1.SprinBoot2.x响应 ...

  9. WebFlux基础之响应式编程

    上篇文章,我们简单的了解了WebFlux的一些基础与背景,并通过示例来写了一个demo.我们知道WebFlux是响应式的web框架,其特点之一就是可以通过函数式编程方式配置route.另外究竟什么是响 ...

随机推荐

  1. python3 安装pip提示没有distutils.util模块错误的解决

    Python3 安装pip 提示ModuleNotFoundError: No module named 'distutils.util'   环境ubutun14,python版本是python3. ...

  2. [非原创]Office 2019 增强版 批处理激活 亲测成功

    忘了原创网址了,在 https://www.52pojie.cn/ 上看到的,这里我备忘一下,希望知道原创网址的朋友告诉我一下,谢谢! 将下面批处理脚本存成.bat文件后,以管理员方式运行: @ech ...

  3. elasticsearch启动日志报错not enough master nodes discovered during pinging (found [[]], but needed [-1]), pinging again

    排查步骤 逻辑上讲是,一个节点去ping  master节点,结果却没有得到回应,多次重试依旧失败.应该重点观察: 1.master启动后,IP是否可以有防火墙权限,设置防火墙规则或则直接关闭防火墙 ...

  4. 《精通并发与Netty》学习笔记(14 - 解决TCP粘包拆包(二)Netty自定义协议解决粘包拆包)

    一.Netty粘包和拆包解决方案 Netty提供了多个解码器,可以进行分包的操作,分别是: * LineBasedFrameDecoder (换行)   LineBasedFrameDecoder是回 ...

  5. vue 解决jsonp跨域

    在Vue中使用jsonp 参考链接:https://blog.csdn.net/m0_38134431/article/details/87930647 在vue中使用vue-jsonp 参考链接:h ...

  6. java 面试题汇总

    一.Java 基础 1.JDK 和 JRE 有什么区别? JDK是java开发工具包,提供java的开发环境和运行环境.包括编译器.开发工具和更多的类库等.JDK包含了JRE. JRE是java运行环 ...

  7. GDB获取帮助信息

    用help 功能,你可以获得GDB 的命令信息. helph 你可以用help(缩写h)不带参数来显示一个命令分类的简短列表. (gdb) help List of classes of comman ...

  8. String、StringBuilder、StringBuffer的爱恨情仇

    第三阶段 JAVA常见对象的学习 StringBuffer和StringBuilder类 (一) StringBuffer类的概述 (1) 基本概述 下文以StringBuffer为例 前面我们用字符 ...

  9. Java基础语法知识你真的都会吗?

    第一阶段 JAVA基础知识 第二章 Java基础语法知识 在我们开始讲解程序之前,命名规范是我们不得不提的一个话题,虽说命名本应该是自由的,但是仍然有一定的"潜规则",通过你对命名 ...

  10. 内存泄漏之malloc替换方法

    //内存泄漏之malloc替换方法 //内存泄漏之malloc替换方法#include "stdio.h"#include "stdlib.h" /*文件路径名 ...