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 ...
随机推荐
- ABP .NET CORE 连接mysql
1.安装mysql程序集,在项目XXX.EntityFrameworkCore下面添加程序集 pomelo.entityframeworkcore.mysql pomelo.entityframewo ...
- VScode 修改中文字体
打开vscode ctrl+,打开设置 找到font,第一个是首选的英文字体,第二个是中文字体.
- PAT 2018 秋
A 1148 Werewolf - Simple Version 思路比较直接:模拟就行.因为需要序列号最小的两个狼人,所以以狼人为因变量进行模拟. #include <cstdio> # ...
- SpringCloud学习之手把手教你用IDEA搭建入门项目【番外篇】(一)
之前的文章里,我曾经搭建了一个Springcloud项目,但是那个时候我对于SpringCloud架构的很多组件不甚清楚,只是通过查找资料然后动手稀里糊涂的把一个项目成功搭建起来了,其中有很多不合理和 ...
- For循环的几个练习
1.括号里面只能放加或减,如果要使等式成立,括号里面应该放什么运算符12()34()56()78()9 = 59 2.蓝球弹起的高度篮球从10米高的地方落下,每次弹起的高度是原来的0.3倍,问弹跳10 ...
- VC++ DLL 1 一点概念
1.在写代码的时候,我们可能会经常要用到一些封装好的函数或者类,这些可能是C/C++的标准库提供的,也可能是由别人开发的非标准库,这个时候就会涉及到动态链接库或者静态链接库的使用了. 举个例子,做图像 ...
- 2019.3.12 linux关于用户的一些命令
su:默认切换到root 创建用户 adduser :新建一个用户 sudo adduser 新用户名字 :创建新用户 sudo passwd 用户名:修改该用户名的密码 创建组 sudo addgr ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习: 错误 - throw、try 和 catch
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- POJ 1258:Agri-Net Prim最小生成树模板题
Agri-Net Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45050 Accepted: 18479 Descri ...
- Java简单调用Lua
package lua; import org.keplerproject.luajava.LuaState; import org.keplerproject.luajava.LuaStateFac ...