Android响应式编程(一)RxJava前篇[入门基础]

1.RxJava概述

ReactiveX与RxJava

在讲到RxJava之前我们首先要了解什么是ReactiveX,因为RxJava是ReactiveX的一种Java实现。 ReactiveX是Reactive Extensions的缩写,一般简写为Rx,微软给的定义是,Rx是一个函数库,让开发者可以利用可观察序列和LINQ风格查询操作符来编写异步和基于事件的程序,开发者可以用Observables表示异步数据流,用LINQ操作符查询异步数据流, 用Schedulers参数化异步数据流的并发处理,Rx可以这样定义:Rx = Observables + LINQ + Schedulers。

为何要用RxJava

想到异步的操作我们会想到Android的AsyncTask 和Handler,但是随着请求的数量越来越多,代码逻辑将会变得越来越复杂而RxJava却仍旧能保持清晰的逻辑。RxJava的原理就是创建一个Observable对象来干活,然后使用各种操作符建立起来的链式操作,就如同流水线一样把你想要处理的数据一步一步地加工成你想要的成品然后发射给Subscriber。

RxJava与观察者模式

RxJava的异步操作是通过扩展的观察者模式来实现的,不了解观察者模式的可以先看下 设计模式(五)观察者模式这篇文章Rxjava有四个基本的要素:Observable (被观察者)、 Observer (观察者)、 subscribe (订阅)、event(事件)。Observable (被观察者) 和 Observer (观察者)通过 subscribe() 方法实现订阅关系,Observable就可以在需要的时候来通知Observer。

2.RxJava基本用法

在使用RxJava前请现在Android Studio 配置gradle:

其中RxAndroid是RxJava的一部分,在普通的RxJava基础上添加了几个有用的类,比如特殊的调度器,后文会提到。

RxJava的基本用法分为三个步骤,他们分别是:

创建Observer(观察者)

决定事件触发的时候将有怎样的行为

其中onCompleted、onError和onNext是必须要实现的方法,他们的含义分别是:

  • onCompleted:事件队列完结,RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。当不会再有新的 onNext发出时,需要触发 onCompleted() 方法作为完成标志。
  • onError:事件队列异常,在事件处理过程中出异常时,onError() 会被触发,同时队列自动终止,不允许再有事件发出。
  • onNext:普通的事件,将要处理的事件添加到事件队列中。
  • onStart:它会在事件还未发送之前被调用,可以用于做一些准备工作。例如数据的清零或重置,这是一个可选方法,默认情况下它的实现为空。

当然如果要实现简单的功能也可以用到Observer来创建观察者,Observer是一个接口,而上面用到Subscriber是在Observer基础上进行了扩展,在后文的Subscribe订阅过程中Observer也会先被转换为Subscriber来使用。

创建 Observable(被观察者)

它决定什么时候触发事件以及触发怎样的事件。 RxJava 使用 create() 方法来创建一个 Observable ,并为它定义事件触发规则:

通过调用subscriber的方法,不断的将事件添加到任务队列中,也可用just来实现:

上述的代码会依次调用onNext(“杨影枫”)、onNext(“月眉儿”)、onCompleted()。

Subscribe (订阅)

订阅比较简单:

或者也可以调用

运行代码查看log:

3.不完整定义回调

上文介绍了回调的接收主要是依赖subscribe(Observer) 和 subscribe(Subscriber),除此之外RxJava还提供了另一种回调方式,也就是不完整回调。再讲到不完整回调之前我们首先要了解Action,查看RxJava源码我们发现提供了一堆Action:

我们打开Action0来看看:

再打开Action1:

最后看看Action9:

很明显Action后的数字代表回调的参数类型数量,上文订阅也就可以改写为下面的代码:

我们定义了onNextAction来处理onNext的回调,同理我们还定义了onErrorAction和onCompletedAction,最后我们把他传给subscribe方法。很显然这样写的灵活度很大一些,同时我们也可以只传一个或者两个Action:

第一行只定义了onNextAction来处理onNext的回调,而第二行则定义了onNextAction处理onNext的回调,onErrorAction来处理onError的回调。

4.Scheduler

内置的Scheduler

方才我们所做的都是运行在主线程的,如果我们不指定线程,默认是在调用subscribe方法的线程上进行回调的,如果我们想切换线程就需要使用Scheduler。RxJava 已经内置了5个 Scheduler:

  • Schedulers.immediate():默认的,直接在当前线程运行,相当于不指定线程。
  • Schedulers.newThread():总是启用新线程,并在新线程执行操作。
  • Schedulers.io():I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。
  • Schedulers.computation():计算所使用的 Scheduler,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。
  • Schedulers.trampoline():当我们想在当前线程执行一个任务时,并不是立即时,可以用.trampoline()将它入队。这个调度器将会处理它的队列并且按序运行队列中每一个任务。

另外RxAndroid也提供了一个常用的Scheduler:

  • AndroidSchedulers.mainThread():RxAndroid库提供的Scheduler,它指定的操作在主线程中运行。

控制线程

subscribeOn() 和 observeOn() 两个方法来对线程进行控制。 subscribeOn()方法指定 subscribe() 这个方法所在的线程,即事件产生的线程。observeOn()方法指定 Subscriber 回调所运行在的线程,即事件消费的线程。

我们仍旧是用log打印出onNext事件所传递过来的字符串,只不过这一次事件的产生的线程是在io线程上,事件回调的线程则是在主线程。

5.RxJava基础应用

好了,讲的不是很多,我们来举一个例子来消化上面的知识。RxJava+Retrofit访问网络是比较搭的,但是此前我的网络系列并没有介绍Retrofit,所以我们先准备用RxJava+OKHttp来访问网络,至于RxJava+OKHttp访问网络会在此系列的以后的章节做介绍。OKHttp的用法请详见Android网络编程(六)OkHttp3用法全解析这篇文章。 此前我们用OkHttp3访问网络是这样做的:

接下来我们进行改造,首先我们创建Observable(被观察者):

我们将根据Okhttp的回调(不在主线程)来定义事件的规则,调用subscriber.onNext来将请求返回的数据添加到事件队列中。接下来我们来实现观察者:

我们将事件产生也就是访问网络的操作设置为io线程,访问网络回调设置为主线程,所以Toast是能正常显示的。好了这一篇就讲到这里,关于RxJava的文章后期还会写,敬请期待。

原文发布于微信公众号 - 刘望舒(liuwangshuAndroid)

原文发表时间:2016-09-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏阮一峰的网络日志

GPG入门教程

前两篇文章,我介绍了RSA算法。 今天,就接着来看,现实中怎么使用这个算法,对信息加密和解密。这要用到GnuPG软件(简称GPG),它是目前最流行、最好用的加密...

3867
来自专栏PHP在线

apache开启openssl支持

一、 加载 Apache SSL 模块 如果已经安装过 apache2.2 ,现在需要额外添加 SSL 支持,那么你需要重新编译安装一次 apache2。 编...

5057
来自专栏码匠的流水账

apk文件的sign以及align命令

对于android应用来说,发布release版本的时候,需要有个正式的签名,这个时候就需要用到jarsigner命令了。

1352
来自专栏小樱的经验随笔

【经验分享】Hydra(爆破神器)使用方法

这个也是backtrack下面很受欢迎的一个工具 参数详解: -R 根据上一次进度继续破解 -S 使用SSL协议连接 -s 指定端口 -l 指定用户名 -L 指...

7456
来自专栏流媒体

Https详解+wireshark抓包演示

在说HTTPS之前先说说什么是HTTP,HTTP就是我们平时浏览网页时候使用的一种协议。HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传...

5465
来自专栏FreeBuf

一款使用PowerShell和证书来加密文件的工具

在之前的两篇文章中,我已经教大家如何使用证书加解密文件,但总的来说操作过程还是有些繁杂。今天我将为你们提供一个文件加密工具,来自动化的帮我们完成这些过程。关于证...

1430
来自专栏YouMeek

优化单点登录流程的好东西:JWT 介绍

JWT 概念 官网介绍:https://jwt.io/introduction/ 别人翻译(翻译得很好):https://github.com/smilings...

1.5K8
来自专栏Python爬虫与数据挖掘

在Windows上如何安装和彻底卸载Adobe Flash Player教程

很多小伙伴在安装水晶易表的时候,经常会遇到“Xcelsius2008需要使用Adobe Flash Player(9.151或者更高版本)”报错问题,如下图所示...

1722
来自专栏LeoXu的博客

一种C/S架构下的 RSA + AES 组合加密方案业务流程

一、初步方案: 1、客户端初始化,调用服务端AES加密key获取接口; 2、服务端从配置文件获取AES加密key,用RSA私钥对其进行加密,返回给客户端; ...

1312
来自专栏惨绿少年

全站HTTPS简单实践

第一个里程碑:创建https证书 1 [root@web01 backup]# openssl req -new -x509 -nodes -out ser...

2260

扫码关注云+社区

领取腾讯云代金券