RxJava的简介

简介: RxJava的简介

前言


提升开发效率,降低维护成本一直是开发团队永恒不变的宗旨。近一年来国内的技术圈子中越来越多的开始提及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代码规范和基本的模式。


ca736fe59de94c221875cb428d7eaff0_b.png

什么是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


相关文章
|
3月前
|
安全 Android开发
你是否了解 RxJava 的 Disposable ?
你是否了解 RxJava 的 Disposable ?
66 0
|
JSON Java 数据格式
rxjava2+retrofit2 简介
rxjava2+retrofit2 简介
75 0
|
Java 程序员
Rxjava实战笔记 | Rxjava的基本使用解析(同步结合示例)
Rxjava实战笔记 | Rxjava的基本使用解析(同步结合示例)
|
Java Android开发
关于Rxjava的简单使用
本篇只是讲一下Rxjava的简单入门使用,想要详解的请移步其他博主文章,关于RxJava详解的文章网上一大堆,本片文章内容适合小白学习。
132 1
|
安全 Android开发
详解 RxJava 的 Disposable
RxJava2 的 Disposable,可以在适当时机取消订阅、截断数据流,避免 Android 中的内存泄露。
980 0
|
Java Go Android开发
RxJava2
函数式编程是一种编程范式。我们常见的编程范式有命令式编程、函数式编程和逻辑式编程。我们常见的面向对象编程是一种命令式编程。命令式编程是面向计算机硬件的抽象,有变量、赋值语句、表达式和控制语句。而函数式编程是面向数学的抽象,将计算描述为一种表达式求值,函数可以在任何地方定义,并且可以对函数进行组合。响应式编程是一种面向数据流和变化传播的编程范式,数据更新是相关联的。把函数式编程里的一套思路和响应式编程合起来就是函数响应式编程。函数响应式编程可以极大地简化项目,特别是处理嵌套回调的异步事件、复杂的列表过滤和变换或者时间相关问题。在Android开发中使用函数响应式编程的主要有两大框架:
144 0
RxJava2
|
Java 调度 安全
Rxjava深入理解之自己动手编写Rxjava
Demo的源码地址在 mini-rxjava, 有兴趣的可以下载源码来看. 从观察者模式说起 观察者模式,是我们在平时使用的比较多的一种设计模式.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
1146 0
|
Java 数据库 Android开发
06.RxJava初探
基本使用 在build.gradle中加入配置,注意,rxJava和rxAndroid版本一定要相互兼容,不然可能会报错More than one file was found with OS independent path 'META-INF/rxjava.
1154 0
RxJava2学习笔记(3)
接上回继续,今天来学习下zip(打包)操作 一、zip操作 @Test public void zipTest() { Observable.zip(Observable.
1073 0
|
iOS开发
RxJava2学习笔记(2)
上一篇已经熟悉了Observable的基本用法,但是如果仅仅只是“生产-消费”的模型,这就体现不出优势了,java有100种办法可以玩这个:) 一、更简单的多线程 正常情况下,生产者与消费者都在同一个线程里处理,参考下面的代码: final long start = System.
989 0