前言
提升开发效率,降低维护成本一直是开发团队永恒不变的宗旨。近一年来国内的技术圈子中越来越多的开始提及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() { @Override public Boolean call(File file) { String fileName = file.getName(); String dataString = fileName.substring(0, fileName.lastIndexOf(".")); return dataString.equals(CaptureTime); } }).map(new Func1() { @Override public Boolean call(File file) { return moveFile(file.getAbsolutePath(), destDir.getAbsolutePath()); } }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1() { @Override public void call(Boolean arg0) { LogHelper.trace("文件删除" + (arg0 ? "成功" : "失败")); } }, new Action1() { @Override public void call(Throwable arg0) { LogHelper.saveExceptionStackInfo(arg0); } });
从上面这段代码我们可以看到:虽然代码量看起来变复杂了,但是RxJava的实现是一条链式调用,没有任何的嵌套【再也不会存在无数个大括号嵌套的情况了】;整个实现逻辑看起来异常简洁清晰,每步操作我们都可以看得清清楚楚,这对我们的编程实现和后期维护是有巨大帮助的。特别是对于那些回调嵌套的场景。
RxJava的基本概念
扔物线写的RxJava的基本概念还是挺全的:
http://gank.io/post/560e15be2dca930e00da1083
RxJava工具类系列
RxUtil:囊括了最实用的RxJava工具类集合
RxUtil2:一个实用的RxJava2工具类库
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