RxJava的简介

来源:互联网 发布:二级域名 端口号 编辑:程序博客网 时间:2024/05/19 19:31

前言

提升开发效率,降低维护成本一直是开发团队永恒不变的宗旨。近一年来国内的技术圈子中越来越多的开始提及Rx,经过一段时间的学习和探索之后我也深深的感受到了RxJava的魅力。它能帮助我们简化代码逻辑,提升代码可读性。这对于开发效率的提升、后期维护成本的降低帮助都是巨大的。

响应式编程

在介绍RxJava前,我们先聊聊响应式编程。那么什么是响应式编程呢?响应式编程是一种基于异步数据流概念的编程模式。数据流就像一条河:它可以被观测,被过滤,被操作,或者为新的消费者与另外一条流合并为一条新的流。

响应式编程的一个关键概念是事件。事件可以被等待,可以触发过程,也可以触发其它事件。事件是唯一的以合适的方式将我们的现实世界映射到我们的软件中:如果屋里太热了我们就打开一扇窗户。同样的,当我们的app从服务端获取到新的数据后,我们需要更新app上展示UI;来了一条消息通知了,我们就需要展示并处理该条消息,就是是响应事件。

今天,响应式编程最通用的一个场景是UI:我们的移动App必须做出对网络调用、用户触摸输入和系统弹框的响应。在这个世界上,软件之所以是事件驱动并响应的是因为现实生活也是如此。

RxJava的来历

Rx是微软.Net的一个响应式扩展,Rx借助可观测的序列提供一种简单的方式来创建异步的,基于事件驱动的程序。2012年Netflix为了应对不断增长的业务需求开始将.NET Rx迁移到JVM上面。并于13年二月份正式向外展示了RxJava。
从语义的角度来看,RxJava就是.NET Rx。从语法的角度来看,Netflix考虑到了对应每个Rx方法,保留了Java代码规范和基本的模式。

什么是RxJava

那么到底什么是RxJava呢?说到底,RxJava并不是什么比较高深的技术,他不像热修复、消息推送或者数据库框架那样,是解决具体问题的某种技术。对我而言,RxJava只是一套规范,一种编程的新方式。区别于我们之前按功能或者流程去进行程序开发,它将程序分为一个一个的小事件,可以将一套非常复杂的流程或者功能进行拆分,对多个简单重复的流程进行聚合处理。这样大大增加了程序的灵活性和可维护性。

RxJava好在哪

对我而言,RxJava最大的特点就是“变换”。
(1)它可以将一个功能或者一套流程进行拆分或者聚合,并转化为事件进行处理;同时,它又可以将一系列的事件通过订阅去响应一个功能或者一套流程。
(2)它可以对数据进行自由的组合和转化,可以将复杂的逻辑处理转化为多个简单的逻辑处理,不仅不影响效率,还可以让逻辑显得一目了然。
(3)它可以对线程进行灵活的切换和控制。
(4)它能很好地和其他框架(Retrofit)进行组合,发挥更大的威力。

根据条件进行文件软删除:
常规写法:
        File[] sourceFiles = srcDir.listFiles();if (sourceFiles != null && sourceFiles.length > 0) {for (File sourceFile : sourceFiles) {String fileName = sourceFile.getName();String dataString =  fileName.substring(0, fileName.lastIndexOf("."));if (dataString.equals(CaptureTime)) {if (!moveFile(sourceFile.getAbsolutePath(), destDir.getAbsolutePath())) {result = false;}}}}

RxJava写法:

        Observable.from(srcDir.listFiles()).filter(new Func1() {@Overridepublic Boolean call(File file) {String fileName = file.getName();String dataString = fileName.substring(0, fileName.lastIndexOf("."));return dataString.equals(CaptureTime);}}).map(new Func1() {@Overridepublic Boolean call(File file) {return moveFile(file.getAbsolutePath(), destDir.getAbsolutePath());}}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1() {@Overridepublic void call(Boolean arg0) {LogHelper.trace("文件删除" + (arg0 ? "成功" : "失败"));}}, new Action1() {@Overridepublic void call(Throwable arg0) {LogHelper.saveExceptionStackInfo(arg0);}});

从上面这段代码我们可以看到:虽然代码量看起来变复杂了,但是RxJava的实现是一条链式调用,没有任何的嵌套【再也不会存在无数个大括号嵌套的情况了】;整个实现逻辑看起来异常简洁清晰,每步操作我们都可以看得清清楚楚,这对我们的编程实现和后期维护是有巨大帮助的。特别是对于那些回调嵌套的场景。


RxJava的基本概念

扔物线写的RxJava的基本概念还是挺全的:http://gank.io/post/560e15be2dca930e00da1083

RxJava的常用操作符

常用操作符介绍文档:http://blog.csdn.net/maplejaw_/article/details/52396175
官方的介绍文档:http://reactivex.io/documentation/observable.html
中文版介绍文档:https://mcxiaoke.gitbooks.io/rxdocs/content/

RxJava的最佳实践

使用Rxjava提升用户体验:(搜索框)http://www.jianshu.com/p/33c548bce571



原创粉丝点击