参考:给 Android 开发者的 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 好在哪?就好在简洁,好在那把什么复杂逻辑都能穿成一条线的简洁。

最新文章

  1. JavaScript 特殊对象 Array-Like Objects 详解
  2. Icon Font浅谈
  3. 【虚拟机】苹果虚拟机mac10.11.6+Xcode8.1
  4. Binary Tree Postorder Traversal--leetcode难题讲解系列
  5. windbg加载sos.dll
  6. Effective Java 15 Minimize mutability
  7. Asp.Net 上传图片并生成高清晰缩略图(转)
  8. POJ 3254 Corn Fields (状压dp)
  9. 【原】Redis-LRU缓存
  10. select2的基本用法
  11. VR全景加盟、720全景、VR全景技术平台-全国招商模式疯狂开始
  12. Linux 软件安装到 /usr,/usr/local/ 还是 /opt 目录区别
  13. 特殊计数序列——Catalan数
  14. Git——入门操作加创建账号【三】
  15. SNet解读
  16. hdu-1394(线段树&amp;逆序数的性质和求法)
  17. 黑吃黑第一季/全集Banshee迅雷下载
  18. git stash 暂存恢复和文件误删恢复
  19. C语言利用 void 类型指针实现面向对象类概念与抽象。
  20. UART、SPI、I2C协议异同点

热门文章

  1. pytest.2.运行多个文件
  2. [蓝桥杯]ALGO-8.算法训练_操作格子
  3. 【springboot】之 解析@EnableWebMvc 、WebMvcConfigurationSupport和WebMvcConfigurationAdapter
  4. 【mongodb】之安装
  5. STL基础--流
  6. PyQt5学习笔记14----初识pyqt多线程操作
  7. Kowala协议:一组分布式,自我调节,资产跟踪特性的加密货币(二)
  8. [UE4]让机器人开枪射击
  9. man iptables 8
  10. elasticsearch 外网访问9200端口访问