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 ...
随机推荐
- POJ 1039:Pipe 计算几何
Pipe Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9773 Accepted: 2984 Description ...
- 【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等
redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.red ...
- 深入X64架构(翻译)
| 本人只是原创翻译,而且翻译也不一定好,纯当锻炼.内容如果英文好的同学,建议直接去看英文原版,比较爽. NBAOL系列2代产品是 windows平台64位的应用程序,在技术测试过程中,遇到一些cra ...
- NET CLR via C#(第4版)第4章 类型基础
本章内容: 1 所有类型都从System.Object派生 2 类型转换 3 命名空间和程序集 4 运行时的相互关系 本章讲述使用类型和CLR时需掌握的基础知识.具体地说,要讨论所有类型都具有的一 ...
- Day 5 :ArrayList原理、LinkedList原理和方法和迭代器注意事项
迭代器在变量元素的时候要注意事项: 在迭代器迭代元素 的过程中,不允许使用集合对象改变集合中的元素个数,如果需要添加或者删除只能使用迭代器的方法进行操作. 如果使用过了集合对象改变集合中元素个数那 ...
- MFC 打开Jpg文件
UpdateWindow(); int height, width; CRect rect;//定义矩形类 CRect rect1; CImage image; //创建图片类 image.Load( ...
- jQuery.ajax提交JSON数据
$.ajax({ type: 'POST', url: "URL", contentType:'application/json', //需要加contentType crossD ...
- h5-全屏插件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python进阶(三)~~~装饰器和闭包
一.闭包 满足条件: 1. 函数内嵌套一个函数: 2.外层函数的返回值是内层函数的函数名: 3.内层嵌套函数对外部作用域有一个非全局变量的引用: def func(): print("=== ...
- http与socket
http是一个应用层的协议 socket不是一个协议,而是一个编程(API)接口