深入浅出RxJava(一:基础篇)

深入浅出RxJava(二:操作符)

深入浅出RxJava三--响应式的好处

深入浅出RxJava四-在Android中使用响应式编程

RxJava 到底是什么?

一个词:异步

RxJava 好在哪?

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

一个词:简洁

RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。

(一)基本使用

1, 创建一个Observable对象,直接调用Observable.create即可
  1. Observable<String> myObservable = Observable.create(
  2. new Observable.OnSubscribe<String>() {
  3. @Override
  4. public void call(Subscriber<? super String> sub) {
  5. sub.onNext("Hello, world!");
  6. sub.onCompleted();
  7. }
  8. }
  9. );

这里定义的Observable对象仅仅发出一个Hello World字符串,然后就结束了。

2, 创建一个Subscriber来处理Observable对象发出的字符串。

  1. Subscriber<String> mySubscriber = new Subscriber<String>() {
  2. @Override
  3. public void onNext(String s) { System.out.println(s); }
  4. @Override
  5. public void onCompleted() { }
  6. @Override
  7. public void onError(Throwable e) { }
  8. };

这里subscriber仅仅就是打印observable发出的字符串。

3, 通过subscribe函数就可以将我们定义的myObservable对象和mySubscriber对象关联起来,这样就完成了subscriber对observable的订阅。

一旦mySubscriber订阅了myObservable,myObservable就会调用mySubscriber对象的onNext和onComplete方法,mySubscriber就会打印出Hello World!

 

(二)操作符

map: 映射, 变换, 用来把把一个事件转换为另一个事件的。

flatMap: 平滑映射, 接收一个Observable的输出作为输入,同时输出另外一个Observable。

filter: 过滤, 输出和输入相同的元素,并且会过滤掉那些不满足检查条件的。

doOnNext(): 在每次输出一个元素之前做一些额外的事情

take: 输出最多指定数量的结果。

...更多操作符请查看官方api文档.

(三)响应式的好处

(四)在Android中使用响应式编程

例子:

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

  1. new Thread() {
  2. @Override
  3. public void run() {
  4. super.run();
  5. for (File folder : folders) {
  6. File[] files = folder.listFiles();
  7. for (File file : files) {
  8. if (file.getName().endsWith(".png")) {
  9. final Bitmap bitmap = getBitmapFromFile(file);
  10. getActivity().runOnUiThread(new Runnable() {
  11. @Override
  12. public void run() {
  13. imageCollectorView.addImage(bitmap);
  14. }
  15. });
  16. }
  17. }
  18. }
  19. }
  20. }.start();

而如果使用 RxJava ,实现方式是这样的:

  1. Observable.from(folders)
  2. .flatMap(new Func1<File, Observable<File>>() {
  3. @Override
  4. public Observable<File> call(File file) {
  5. return Observable.from(file.listFiles());
  6. }
  7. })
  8. .filter(new Func1<File, Boolean>() {
  9. @Override
  10. public Boolean call(File file) {
  11. return file.getName().endsWith(".png");
  12. }
  13. })
  14. .map(new Func1<File, Bitmap>() {
  15. @Override
  16. public Bitmap call(File file) {
  17. return getBitmapFromFile(file);
  18. }
  19. })
  20. .subscribeOn(Schedulers.io())
  21. .observeOn(AndroidSchedulers.mainThread())
  22. .subscribe(new Action1<Bitmap>() {
  23. @Override
  24. public void call(Bitmap bitmap) {
  25. imageCollectorView.addImage(bitmap);
  26. }
  27. });

那位说话了:『你这代码明明变多了啊!简洁个毛啊!』大兄弟你消消气,我说的是逻辑的简洁,不是单纯的代码量少(逻辑简洁才是提升读写代码速度的必杀技对不?)。观察一下你会发现, RxJava 的这个实现,是一条从上到下的链式调用,没有任何嵌套,这在逻辑的简洁性上是具有优势的。当需求变得复杂时,这种优势将更加明显(试想如果还要求只选取前 10 张图片,常规方式要怎么办?如果有更多这样那样的要求呢?再试想,在这一大堆需求实现完两个月之后需要改功能,当你翻回这里看到自己当初写下的那一片迷之缩进,你能保证自己将迅速看懂,而不是对着代码重新捋一遍思路?)。

另外,如果你的 IDE 是 Android Studio ,其实每次打开某个 Java 文件的时候,你会看到被自动 Lambda 化的预览,这将让你更加清晰地看到程序逻辑:

  1. Observable.from(folders)
  2. .flatMap((Func1) (folder) -> { Observable.from(file.listFiles()) })
  3. .filter((Func1) (file) -> { file.getName().endsWith(".png") })
  4. .map((Func1) (file) -> { getBitmapFromFile(file) })
  5. .subscribeOn(Schedulers.io())
  6. .observeOn(AndroidSchedulers.mainThread())
  7. .subscribe((Action1) (bitmap) -> { imageCollectorView.addImage(bitmap) }); 

深入原理:给 Android 开发者的 RxJava 详解

深入浅出RxJava的更多相关文章

  1. 深入浅出RxJava(一:基础篇)

    RxJava正在Android开发者中变的越来越流行.唯一的问题就是上手不容易,尤其是大部分人之前都是使用命令式编程语言.但是一旦你弄明白了,你就会发现RxJava真是太棒了. 这里仅仅是帮助你了解R ...

  2. 深入浅出RxJava(三:响应式的好处)

    在第一篇中,我介绍了RxJava的基础知识.第二篇中,我向你展示了操作符的强大.但是你可能仍然没被说服.这篇里面,我讲向你展示RxJava的其他的一些好处,相信这篇足够让你去使用Rxjava. 错误处 ...

  3. 深入浅出RxJava(二:操作符)

    看完这篇blog,我相信你肯定想立即在你的项目中使用RxJava了,这篇blog将介绍许多RxJava中的操作符,RxJava的强大性就来自于它所定义的操作符. 首先先看一个例子: 准备工作 假设我有 ...

  4. 深入浅出RxJava就这一篇就够了

    前言: 第一次接触RxJava是在前不久,一个新Android项目的启动,在评估时选择了RxJava.RxJava是一个基于事件订阅的异步执行的一个类库.听起来有点复杂,其实是要你使用过一次,就会大概 ...

  5. Android中使用反应式编程RxJava

    GitHut 地址: https://github.com/ReactiveX/RxAndroid (1)RxJava简介: RxJava 是一个在Java虚拟机上实现的响应式扩展库:提供了基于obs ...

  6. 关于 RxJava 技术介绍

    Awesome-RxJava RxJava resources Blog 给 Android 开发者的 RxJava 详解 -强烈推荐 扔物线的文章 讲解非常详细 NotRxJava懒人专用指南 -这 ...

  7. Android RxJava

    GitHut 地址: https://github.com/ReactiveX/RxAndroid build.gradle: compile 'io.reactivex:rxandroid:1.2. ...

  8. [Android] 转-RxJava+MVP+Retrofit+Dagger2+Okhttp大杂烩

    原文url: http://blog.iliyun.net/2016/11/20/%E6%A1%86%E6%9E%B6%E5%B0%81%E8%A3%85/ 这几年来android的网络请求技术层出不 ...

  9. RxJava重温基础

    RxJava是什么 a library for composing asynchronous and event-based programs using observable sequences f ...

随机推荐

  1. Linux2.6内核--进程调度理论

    从1991年Linux的第1版到后来的2.4内核系列,Linux的调度程序都相当简陋,设计近乎原始,见0.11版内核进程调度.当然它很容易理解,但是它在众多可运行进程或者多处理器的环境下都难以胜任. ...

  2. Menu创建菜单

    菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu).上下文菜单(ContextMenu)和子菜单(SubMenu),今天这讲是O ...

  3. 聊下 git rebase -i

    在使用git作为源代码管理工具的时候,开发的时经常会面临一个常见的问题,多个commit 需要合并为一个完整的commit提交. 在一个基本的迭代周期里,你会有很多次commit,有跟配置文件相关的, ...

  4. JSP分页显示实例(基于Bootstrap)

    首先介绍一款简单利落的分页显示利器:bootstrap-paginator 效果截图: GitHub官方下载地址:https://github.com/lyonlai/bootstrap-pagina ...

  5. Writing to a MySQL database from SSIS

    Writing to a MySQL database from SSIS 出处  :  http://blogs.msdn.com/b/mattm/archive/2009/01/07/writin ...

  6. apache ab测试命令详解

    这篇文章主要介绍了apache性能测试工具ab使用详解,需要的朋友可以参考下   网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环.只有让服务器处在高压情况下,才能真正体现出软件.硬件等各种 ...

  7. 删除docker的运行目录出错

    1.      错误类型

  8. [转]说说JSON和JSONP,也许你会豁然开朗,含jQuery用例

    本文转自:http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html 前言: 说到AJAX就会不可避免的面临两 ...

  9. 编码中的setCharacterEncoding 理解

    1.pageEncoding="UTF-8"的作用是设置JSP编译成Servlet时使用的编码.  2.contentType="text/html;charset=UT ...

  10. Python 数据类型及其用法

    本文总结一下Python中用到的各种数据类型,以及如何使用可以使得我们的代码变得简洁. 基本结构 我们首先要看的是几乎任何语言都具有的数据类型,包括字符串.整型.浮点型以及布尔类型.这些基本数据类型组 ...