RxJava学习(一)——简介及其优势
RxJava是什么
RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。
一个词总结一下就是:异步。RxJava 的本质可以压缩为异步这一个词。说到根上,它就是一个实现异步操作的库,而别的定语都是基于这之上的。
RxJava 好在哪
一个词:简洁。
异步操作很关键的一点是程序的简洁性,因为在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。 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<File, Observable<File>>() {
@Override
public Observable<File> call(File file) {
return Observable.from(file.listFiles());
}
})
.filter(new Func1<File, Boolean>() {
@Override
public Boolean call(File file) {
return file.getName().endsWith(".png");
}
})
.map(new Func1<File, Bitmap>() {
@Override
public Bitmap call(File file) {
return getBitmapFromFile(file);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
imageCollectorView.addImage(bitmap);
}
});
RxJava的优势是逻辑的简洁,不是单纯的代码量少(逻辑简洁才是提升读写代码速度的必杀技对不?)。观察一下你会发现, RxJava 的这个实现,是一条从上到下的链式调用,没有任何嵌套,这在逻辑的简洁性上是具有优势的。当需求变得复杂时,这种优势将更加明显
另外,如果你的 IDE 是 Android Studio ,其实每次打开某个 Java 文件的时候,你会看到被自动 Lambda 化的预览,这将让你更加清晰地看到程序逻辑:
Observable.from(folders)
.flatMap((Func1) (folder) -> { Observable.from(file.listFiles()) })
.filter((Func1) (file) -> { file.getName().endsWith(".png") })
.map((Func1) (file) -> { getBitmapFromFile(file) })
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe((Action1) (bitmap) -> { imageCollectorView.addImage(bitmap) });
所以, RxJava 好在哪?就好在简洁,好在那把什么复杂逻辑都能穿成一条线的简洁。
最新文章
- JavaScript 特殊对象 Array-Like Objects 详解
- Icon Font浅谈
- 【虚拟机】苹果虚拟机mac10.11.6+Xcode8.1
- Binary Tree Postorder Traversal--leetcode难题讲解系列
- windbg加载sos.dll
- Effective Java 15 Minimize mutability
- Asp.Net 上传图片并生成高清晰缩略图(转)
- POJ 3254 Corn Fields (状压dp)
- 【原】Redis-LRU缓存
- select2的基本用法
- VR全景加盟、720全景、VR全景技术平台-全国招商模式疯狂开始
- Linux 软件安装到 /usr,/usr/local/ 还是 /opt 目录区别
- 特殊计数序列——Catalan数
- Git——入门操作加创建账号【三】
- SNet解读
- hdu-1394(线段树&;逆序数的性质和求法)
- 黑吃黑第一季/全集Banshee迅雷下载
- git stash 暂存恢复和文件误删恢复
- C语言利用 void 类型指针实现面向对象类概念与抽象。
- UART、SPI、I2C协议异同点
热门文章
- pytest.2.运行多个文件
- [蓝桥杯]ALGO-8.算法训练_操作格子
- 【springboot】之 解析@EnableWebMvc 、WebMvcConfigurationSupport和WebMvcConfigurationAdapter
- 【mongodb】之安装
- STL基础--流
- PyQt5学习笔记14----初识pyqt多线程操作
- Kowala协议:一组分布式,自我调节,资产跟踪特性的加密货币(二)
- [UE4]让机器人开枪射击
- man iptables 8
- elasticsearch 外网访问9200端口访问