RxJava Android使用详解

来源:互联网 发布:詹姆斯数据统计 编辑:程序博客网 时间:2024/05/16 17:13

RxJava 到底是什么
RxJava 好在哪
API 介绍和原理简析
1. 概念:扩展的观察者模式
观察者模式
RxJava 的观察者模式
2. 基本实现
1) 创建 Observer
2) 创建 Observable
3) Subscribe (订阅)
4) 场景示例
a. 打印字符串数组
b. 由 id 取得图片并显示
3. 线程控制 —— Scheduler (一)
1) Scheduler 的 API (一)
2) Scheduler 的原理 (一)
4. 变换
1) API
2) 变换的原理:lift()
3) compose: 对 Observable 整体的变换
5. 线程控制:Scheduler (二)
1) Scheduler 的 API (二)
2) Scheduler 的原理(二)
3) 延伸:doOnSubscribe()
RxJava 的适用场景和使用方式
1. 与 Retrofit 的结合
2. RxBinding
3. 各种异步操作
4. RxBus
最后
关于作者:
为什么写这个?
在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github:
https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid
引入依赖:
compile ‘io.reactivex:rxjava:1.0.14’
compile ‘io.reactivex:rxandroid:1.0.1’
(版本号是文章发布时的最新稳定版)

另外,感谢 RxJava 核心成员流火枫林的技术支持和内测读者代码家、鲍永章、drakeet、马琳、有时放纵、程序亦非猿、大头鬼、XZoomEye、席德雨、TCahead、Tiiime、Ailurus、宅学长、妖孽、大大大大大臣哥、NicodeLee的帮助,以及周伯通招聘的赞助。

RxJava 到底是什么

一个词:异步。

RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。

然而,对于初学者来说,这太难看懂了。因为它是一个『总结』,而初学者更需要一个『引言』。

其实, RxJava 的本质可以压缩为异步这一个词。说到根上,它就是一个实现异步操作的库,而别的定语都是基于这之上的。

RxJava 好在哪

换句话说,『同样是做异步,为什么人们用它,而不用现成的 AsyncTask / Handler / XXX / … ?』

一个词:简洁。

异步操作很关键的一点是程序的简洁性,因为在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。 Android 创造的 AsyncTask 和Handler ,其实都是为了让异步代码更加简洁。RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。

举个例子

假设有这样一个需求:界面上有一个自定义的视图 imageCollectorView ,它的作用是显示多张图片,并能使用 addImage(Bitmap) 方法来任意增加显示的图片。现在需要程序将一个给出的目录数组 File[] folders 中每个目录下的 png 图片都加载出来并显示在 imageCollectorView 中。需要注意的是,由于读取图片的这一过程较为耗时,需要放在后台执行,而图片的显示则必须在 UI 线程执行。常用的实现方式有多种,我这里贴出其中一种:

new Thread() {
@Override
public void run() {
super.run();
for (File folder : folders) {
File[] files = folder.listFiles();
for (File file : files) {
if (file.getName().endsWith(“.png”)) {
final Bitmap bitmap = getBitmapFromFile(file);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
imageCollectorView.addImage(bitmap);
}
});
}
}
}
}
}.start();
而如果使用 RxJava ,实现方式是这样的:

Observable.from(folders)
.flatMap(new Func1

原创粉丝点击