RxJava的简单使用
0x00 介绍
先简单介绍一下这个库,Rx的一系列实现都是为了解决同一个问题,就是让异步编程变的更加简单。它的主要思想是使用观察者模式,分离了数据源和数据的使用者,同时它拓展了观察者模式,将数据源中的数据抽象成数据流,在此之上,通过操作符来处理流中的数据,具有非常好的拓展性。RxJava/RxAndroid是针对通用Java平台和Android平台的具体实现,详细文档可以参考官方网站 reactivex.io。
0x01 基本概念
首先我们来看一下几个关键的概念。
1.可观察对象:Observable
这是RxJava中的核心元素,它是对数据源的一次包装,让一个普通数据源,变成一个可观察的对象,后续的操作都是建立在这个基础之上的,我们可以简单的把它理解成观察者模式中的主题
2.观察者:Observer
有可观察的对象,那么必然会有观察者,Observer就是对观察者的包装,借助它我们具有了从Observable中获取数据的能力
以上两个概念,我们在观察者模式中同样可以看到,并没有什么稀奇。接下来的几个概念就是对观察者模式的拓展。
3.操作符:Operator
在最开始我们提到,Rx中数据源中的数据被抽象成数据流,对于数据流,我们简单的理解为一个未知长度的数组,我们可以对这个数组进行过滤,映射等操作,而所有的这些操作在Rx中都被定义为Operator。
4.调度器:Scheduler
既然Rx是一个用来处理异步操作的库,那么在不同的线程上执行不同的操作是一个必须有的功能,相比于通常的线程调度,Rx将线程切换定义成了一个操作符,非常简单的实现了线程调度的功能。
上述就是Rx中的几个重要的概念,当然,Rx是一个非常强大的库,内部的实现远不止这些,但是作为一个初学者,我们先了解到这里。
0x02 简单尝试
下面我们来简单的写几行代码,感受一下RxJava的魅力。

上面的代码展示了RxJava的基本使用方式,演示了几个基本的操作符和线程调度,我们可以发现,使用RxJava进行异步操作,有以下几个优点:
- 代码的可读性大幅提高,基本可以达到代码文档化。
- 线程调度简单方便,避免了一系列的回调。
- 支持链式调用。
- 对异常的统一处理,这一点尤为关键。在RxJava中,异常作为数据流的一部分,被逐级传递,我们可以在最终使用数据的地方进行统一处理,避免了多次的try catch。大专栏 RxJava的简单使用/li>
0x03 实战
我们尝试一下,将RxJava简单的应用到我们的项目中,先举个栗子,在审批详情页中,有这样一个逻辑:
|
|
我们先来看一下原始的代码是怎么写的,如图所示。

借助Bolts库的Task类,反序列化和预处理被放入异步线程中执行,然后再切换到主线程渲染页面,这个过程说不上错误,但是,并不优雅,当然也有优化的空间,我们看一下使用Task如何优化这个调用过程。

为了让错误能够在最终的处理过程中被处理,我们不得不创建了一个新的类ApprovalResult,这个类封装了预处理后的数据和错误信息,然后切换到主线程,执行错误处理或者渲染页面。
总的来说,比原始的代码要好看了一点,减少了一层嵌套的回调。那么,如果使用RxJava,这段代码我们要怎么写呢?请看下图。

首先一点,我们不必再为传递错误创建一个新的model,其次,操作符的链式调用更能直观的反应代码的逻辑,虽然代码看上去变长了,但是,读起来并没有什么障碍。
0x04 结论
通过上述简单的分析,我们可以大概的看出RxJava在处理异步操作时的能力,由于目前我对RxJava的理解还比较粗浅,所以对它的应用还停留在非常基础的层面上。实际上,RxJava的应用场景非常广泛。例如:
- 和Retrofit结合,将网络请求的结果包装成Observable
- RxBinding,这是一个对View控件的封装,将View的产生的click,touch事件转换成Observable
- RxBus,一个使用RxJava实现的EventBus
当然,RxJava也有它的问题:
- 这个库上手颇有难度。
- 源码不太好读,包含大量的泛型
- 包含大概4300个方法和域,对于Android来说,是一个比较大的库了。
以上就是我对RxJava目前的认识,还非常浅薄,后续我会继续学习这个库的高级用法,尽请期待下一期,《RxJava的进阶使用》
RxJava的简单使用的更多相关文章
- Android--Retrofit+RxJava的简单封装(三)
1,继续接着上一篇的讲讲,话说如果像上一篇这样的话,那么我们每一次请求一个结构都要创建一堆的Retrofit对象,而且代码都是相同的,我们可以试试封装一下 先创建一个HttpMethods类,将Ret ...
- Android开发之《RXJava的简单实现》
import android.util.Log; import rx.Observable; import rx.Subscriber; import rx.functions.Action1; pu ...
- RxJava +Retrofit 简单使用
1.添加依赖 compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.squareup.retrofit2:adapter ...
- Android消息传递之基于RxJava实现一个EventBus - RxBus
前言: 上篇文章学习了Android事件总线管理开源框架EventBus,EventBus的出现大大降低了开发成本以及开发难度,今天我们就利用目前大红大紫的RxJava来实现一下类似EventBus事 ...
- 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...
- RxJava整合Retrofit遇到的问题总结
一:初上手(填坑) Observable将事件序列执行完毕后,会回调Observe的onNext()方法和onCompleted()方法,当出现异常/错误时会调用onError()方法. 由此,我们推 ...
- RxJava系列3(转换操作符)
RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...
- 手把手带你走进MVP +Dagger2 + DataBinding+ Rxjava+Retrofit 的世界
0.0 Android开发现在的变化用一个词来形容就是 :翻天覆地 越来越多的项目使用了MVP + Rxjava+Retrofit +Dagger2 + DataBinding等等东西.. 但是这些东 ...
- Android框架式编程之RxJava(一):HelloWorld
Hello World 源码: import android.graphics.Bitmap; import android.graphics.BitmapFactory; import androi ...
随机推荐
- python 对axis的理解
首先请看一下官方帮助的解释: 轴用来为超过一维的数组定义的属性,二维数据拥有两个轴:第0轴沿着行的垂直往下,第1轴沿着列的方向水平延伸. 注意看,官方对于0和1的解释是轴,也就是坐标轴.而坐标轴是有 ...
- 使用GDI+显示OpenCV中的图像IplImage
OpenCV虽然自带了轻量级的界面库HighGUI,但是支持的图像化元素实在是太少了,一般只在前期算法测试时使用.实际产品还是使用MFC库.因此本文记录了如何在GDI+中显示OpenCV中的IplIm ...
- js 一年中多个时间段 天数去重
Date.prototype.format = function() { var s = ''; var mouth = (this.getMonth() + 1)>=10?(this.getM ...
- Python pip换源
前言 哈喽呀,小伙伴们,晚上好呀,今天要给大家带来点什么呐,我们就来说说python的pip换源吧,这个换源,相对来说,还是比较重要的,能少生好几次气的,哈哈哈 为什么要换源 我们搞python的,肯 ...
- 欧拉回路--P2731 骑马修栅栏 Riding the Fences
实在懒得复制题干了 *传送 1.定义 *如果图G(有向图或者无向图)中所有边一次仅且一次行遍所有顶点的通路称作欧拉通路. *如果图G中所有边一次仅且一次行遍所有顶点的回路称作欧拉回路. *具有欧拉回路 ...
- 在swift调用OC的第三方库
https://www.jianshu.com/p/4799ac1d7dce 2017.06.02 23:55* 字数 275 阅读 1619评论 0喜欢 3 环境:xcode 8.3.2 系统: M ...
- 说一说我了解的react生命周期函数
我了解的几个阶段 Mounting 挂载 Updating 更新 Unmounting 卸载 我说几个我常用的钩子函数 1.挂载阶段Mounting 1)constructor():函数构造器 执行次 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 变量作用域
作用域是程序的一个区域,一般来说有三个地方可以定义变量: 在函数或一个代码块内部声明的变量,称为局部变量. 在函数参数的定义中声明的变量,称为形式参数. 在所有函数外部声明的变量,称为全局变量. 局部 ...
- XML--XSL
参考 http://blog.51cto.com/cnn237111/1345998 https://www.w3.org/TR/2017/REC-xslt-30-20170608/ 声明 把文档声明 ...
- html—表单控件
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...