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


相关文章
|
Java 程序员
Rxjava实战笔记 | Rxjava的基本使用解析(同步结合示例)
Rxjava实战笔记 | Rxjava的基本使用解析(同步结合示例)
|
JSON Java 数据格式
rxjava2+retrofit2 简介
rxjava2+retrofit2 简介
107 0
|
Java Android开发
关于Rxjava的简单使用
本篇只是讲一下Rxjava的简单入门使用,想要详解的请移步其他博主文章,关于RxJava详解的文章网上一大堆,本片文章内容适合小白学习。
174 1
|
Java API
RxJava 之 ParallelFlowable
RxJava 之 ParallelFlowable
285 0
RxJava 之 ParallelFlowable
|
Java
RxJava1 升级到 RxJava2 所踩过的坑
RxJava1 升级到 RxJava2 所踩过的坑
285 0
RxJava1 升级到 RxJava2 所踩过的坑
|
缓存 Java Android开发
一文详解 RxJava2 使用及实现原理
RxJava—一个可以在JVM上运行的,基于观察者模式 实现异步操作的java库。其英文描述为:RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java
552 0
一文详解 RxJava2 使用及实现原理
|
Java 调度 安全
Rxjava深入理解之自己动手编写Rxjava
Demo的源码地址在 mini-rxjava, 有兴趣的可以下载源码来看. 从观察者模式说起 观察者模式,是我们在平时使用的比较多的一种设计模式.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
1176 0
|
Java 数据库 Android开发
06.RxJava初探
基本使用 在build.gradle中加入配置,注意,rxJava和rxAndroid版本一定要相互兼容,不然可能会报错More than one file was found with OS independent path 'META-INF/rxjava.
1184 0
RxJava2学习笔记(3)
接上回继续,今天来学习下zip(打包)操作 一、zip操作 @Test public void zipTest() { Observable.zip(Observable.
1110 0
|
iOS开发
RxJava2学习笔记(2)
上一篇已经熟悉了Observable的基本用法,但是如果仅仅只是“生产-消费”的模型,这就体现不出优势了,java有100种办法可以玩这个:) 一、更简单的多线程 正常情况下,生产者与消费者都在同一个线程里处理,参考下面的代码: final long start = System.
1016 0