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的进阶使用》
最新文章
- your local repository contains non-ascii
- redis中setbit的用法
- armv6, armv7, armv7s的区别
- 通过百度echarts实现数据图表展示功能
- cisco VPN配置
- 安装glibc2.7
- 548 - Tree (UVa OJ)
- 封装获取网络信息Linux—API类
- MVC3.0 提交表单的方法
- NYOJ-47 过河问题(贪心)
- Roboguice学习之视图注入
- 哪有Python视频百度云链接?
- 剑指架构师系列-Redis安装与使用
- Flutter获取点击元素的位置与大小
- php中 "$$" 的详解
- 发布一个PHP包到Packagist, 然后使用Composer安装
- Spark 官方博文专区(目录)
- TTL特殊门电路
- 07_Flume_regex interceptor实践
- php文件相关操作