自从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. ffmpeg学习笔记-音频播放

    前文讲到音频解码,将音频解码,并且输入到PCM文件,这里将音频通过AudioTrack直接输出 音频播放说明 在Android中自带的MediaPlayer也可以对音频播放,但其支持格式太少 使用ff ...

  2. codevs 1200:同余方程

    题目描述 Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入描述 Input Description 输入只有一行,包含两个正整数 a, b,用 一个 空 ...

  3. UWP笔记-边框背景虚化效果

    这是一个简单的UI外观 1.添加Negut包: Microsoft.Toolkit.Uwp.UI.Controls 2.xaml:命名空间中引用 xmlns:controls="using: ...

  4. 在vue项目中,将juery设置为全局变量

    1.首先执行:npm install  jQuery --save-dev,在package.json里加入jQuery. 2.修改build下的webpack.base.conf.js 方法一: 首 ...

  5. Cacls和ICacls

    解释:  Cacls:显示或修改文件的访问控制列表(ACL) ICACLS:显示或修改自由访问控制表(Dacl) 上指定的文件,并指定目录中的文件应用于存储的 Dacl. 总结:显示或修改文件访问控制 ...

  6. spring cloud微服务docker启动

    1. 背景 将系统拆分成微服务,一个系统可能拆分成十几个服务,服务太多会影响发布和管理,所以容器话之后易于管理和版本发布,鉴于此将spring cloud微服无docker容器化. 2.依赖环境 Ce ...

  7. 【51nod】2564 格子染色

    [51nod]2564 格子染色 这道题原来是网络流-- 感觉我网络流水平不行-- 这种只有两种选择的可以源点向该点连一条容量为b的边,该点向汇点连一条容量为w的边,如果割掉了b证明选w,如果割掉了w ...

  8. (十二)mybatis 查询缓存

    目录 什么是查询缓存 图解查询缓存 一级缓存 二级缓存 禁用二级缓存 刷新缓存 二级缓存应用场景 二级缓存局限性 什么是查询缓存 mybatis 在查询数据的时候,会将数据存储起来,下次再次查询相同的 ...

  9. 如何设置输入IP地址就直接访问到某一个网站

    如何设置输入IP地址就直接访问到某一个网站 1).在IIS中添加好站点后,在网站绑定中设置明确的IP地址,如下图: 2).修改Default WebSite的端口,或者是把Default WebSit ...

  10. Error starting daemon: error initializing graphdriver: devmapper: Device docker-thinpool is not a thin pool

    Error starting daemon: error initializing graphdriver: devmapper: Device docker-thinpool is not a th ...