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 ...
随机推荐
- c++ opencv 入门
//类型定义 CvPoint point(2, 3); CvPoint2D32f point1(2, 3); CvPoint3D32f point2(2, 3); CvSize size(2, 3); ...
- EUI库 - EXML
EXML是可以运行时加载解析的 <e:Skin class="skins.ButtonSkin" states="up,down,disabled&qu ...
- PHP - 验证码制作加验证
一,主页 index.php <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- jquery特效 - 网站水波纹
1,index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- 【LeetCode】最长回文子串-动态规划法
[问题]给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 : 输入: "babad" 输出: "bab" 注意: ...
- Day3-T4
原题目 Describe:有点恶心的DP+最短路 code: #include<bits/stdc++.h> using namespace std; long long A,B,C,z, ...
- 【转】TransactionScope事务处理方法介绍及.NET Core中的注意事项
什么是TransactionScope呢? TransactionScope作为System.Transactions的一部分被引入到.NET 2.0.同时SqlClient for .NET Cor ...
- POJ-3262 贪心的一个小技巧
Protecting the Flowers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3204 Accepted: ...
- SpringCloud学习之手把手教你用IDEA搭建入门项目(三)
本篇博客是承接上一篇<手把手教你用IDEA搭建SpringCloud入门项目(二)>,不清楚的请到我的博客空间查看后再看本篇博客,上面两篇博客成功创建了一个简单的SpringCloud项目 ...
- CMakeLists添加内部库
SET(RTABMap_LIBRARIES ${PROJECT_SOURCE_DIR}/bin/librtabmap_core.so ${PROJECT_SOURCE_DIR}/bin/librtab ...