理解RxJava:(三)RxJava的优点

第一部分,讲解了RxJava的基本结构。在第二部分,展示了operators的强大之处。但是你们可能仍然没有被说服,也没有足够的理由信服。下面是一些能让你信服的RxJava框架的优点。

错误处理

截至当前,我们一直都忽略onComplete()onError()方法。它们标志着Observable停止发出items以及原因(不管是成功地完成或是不可恢复的错误)。

我们最初的Subscriber有能力监听onComplete()onError()事件。动手实现如下所示:

Observable.just("Hello, world!")
.map(s -> potentialException(s))
.map(s -> anotherPotentialException(s))
.subscribe(new Subscriber<String>() {
@Override
public void onNext(String s) { System.out.println(s); } @Override
public void onCompleted() { System.out.println("Completed!"); } @Override
public void onError(Throwable e) { System.out.println("Ouch!"); }
});

假设potentialException()anotherPotentialException()都能抛出异常。每个Observable都以调用onCompleted()``onError()方法结束。正因为这样, 程序的输出要么是Completed!,要么是Ouch!(因为异常的抛出)

关于这个的补充:

  • 1.onError()方法在有异常在任意时候被抛出的时候被调用。

    这使得错误处理变得更简单。只需要在最后的时候在一个简单的方法中处理所有的错误即可。

  • 2.operators不需要处理异常

Observable链上抛出的任何异常都可以留给 Subscriber决定如何处理。因为onError()方法之前的异常都会被跳过。

  • 3.我们能知道Subscriber完成接收items的时候。

知道任务什么时候结束有助于代码的流动。

在错误处理上, 这个模式要比传统的错误处理简单得多。使用回调,必须在每个回调中处理错误。不仅仅是造成重复代码,也意味着每个回调都需要知道如何处理错误,意味着你的回调代码和调用者高度耦合。

通过RxJava,Observable不需要知道如何处理错误。operators不仅仅不需要处理错误状态,在关键错误发生时,它们会自动跳过。我们可以把所有的错误处理交给Subscriber

调度者(Schedulers)

你有一个需要做网络请求的Android应用。因为可能需要耗费很长时间,于是你在其它线程做网络请求。一般都会遇到这样的问题。

Android应用的多线程操作很难是因为你必须在正确的线程运行对的代码。否则应用会闪退。经典的错误就是当你在非主线程修改View的状态。

在RxJava中,我们能通过subscribeOn()方法指定Observer代码运行的线程,以及observeOn()方法指定Subscriber运行的线程。

myObservableServices.retrieveImage(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(bitmap -> myImageView.setImageBitmap(bitmap));

多么简单?我的Subscriber之前的都运行在I/O线程。最后,View的操作发生在主线程。

最厉害的部分是我能绑定subcribeOn()observeOn()方法到任意的Observable上。

它们仅仅是operators。我不需要担心Observable和之前的operators在做什么。在最后仅仅操作这个就轻易的实现线程的切换。

订阅(Subscriptions)

还有些东西没有讲解。当你调用Observable.subscribe(),返回的是Subscription。这代表着你的ObservableSubscriber之间的联系:

Subscription subscription = Observable.just("Hello, World!")
.subscribe(s -> System.out.println(s));

可以使用Subscription来断绝这个联系:

subscription.unsubscribe();
System.out.println("Unsubscribed=" + subscription.isUnsubscribed());
// 输出 "Unsubscribed=true"

RxJava取消订阅的优点是它能停止方法链。如果你有一个复杂的operators链,调用unsubscribe方法将终止当前正在运行的代码。无需额外的操作。

结论

记住这几篇都是RxJava的入门文章。你们要学的比我现在所讲的要多得多。例如,研读backpressure。我不会在所有地方都用响应式编程。而只会在我想要把复杂逻辑变得更简单的地方使用。

最初,我计划这篇文章是这系列的最后一篇。但是一个常见的需求是RxJava在Android中的实际运用。因此,你能继续阅读第四部分。我希望这个入门系列能引导你们开始学习使用这个有趣的框架。如果你想要进一步学习,我建议阅读RxJava的官方wiki

#######本文翻译自Grokking RxJava, Part 3: Reactive with Benefits,著作权归原作者danlew所有。译文由JohnTsai翻译。转载请注明出处,并保留此段声明。

理解RxJava:(三)RxJava的优点的更多相关文章

  1. RX系列三 | RxJava | create | from | interval | just | range | filter

    RX系列三 | RxJava | create | from | interval | just | range | filter 我们在第一篇里有说过一些基本的关系,现在我们需要用到一些依赖,这里记 ...

  2. 深入理解OOP(三):多态和继承(动态绑定和运行时多态)

    在前面的文章中,我们介绍了编译期多态.params关键字.实例化.base关键字等.本节我们来关注另外一种多态:运行时多态, 运行时多态也叫迟绑定. 深入理解OOP(一):多态和继承(初期绑定和编译时 ...

  3. Java 反射理解(三)-- Java获取方法信息

    Java 反射理解(三)-- Java获取方法信息 基本的数据类型.void关键字,都存在类类型. 举例如下: public class ClassDemo2 { public static void ...

  4. 简单理解Hibernate三种状态的概念及互相转化

    本文描述了Hibernate三种状态的概念及互相转化.Java对象的生命周期中有三种状态,而且互相转化.它们分别是临时状态,持久化状态,以及游离状态. AD:WOT2015 互联网运维与开发者大会 热 ...

  5. 学习C++ Primer 的个人理解(三)

    第三章,主要内容是字符串和数组.感觉作者的意图是希望读者可以早一点可以写出简单的小程序,并且可以早点接触迭代器这种思想. 在我看来,这种内容的难度并不大. 对于编程来说,最重要的应该是思想,类似vec ...

  6. 关于SVM数学细节逻辑的个人理解(三) :SMO算法理解

    第三部分:SMO算法的个人理解 接下来的这部分我觉得是最难理解的?而且计算也是最难得,就是SMO算法. SMO算法就是帮助我们求解: s.t.   这个优化问题的. 虽然这个优化问题只剩下了α这一个变 ...

  7. 深入理解JVM(三)垃圾收集器和内存分配策略

    3.1 关于垃圾收集和内存分配 垃圾收集和内存分配主要针对的区域是Java虚拟机中的堆和方法区: 3.2 如何判断对象是否“存活”(存活判定算法) 垃圾收集器在回收对象前判断其是否“存活”的两个算法: ...

  8. 对HashMap的理解(三):ConcurrentHashMap

    HashMap不是线程安全的.在并发插入元素的时候,有可能出现环链表,让下一次读操作出现死循环.避免HashMap的线程安全问题有很多方法,比如改用HashTable或Collections.sync ...

  9. Spring深入理解(三)

    Spring 中 AOP 特性详解 动态代理的实现原理 要了解 Spring 的 AOP 就必须先了解动态代理的原理,因为 AOP 就是基于动态代理实现的.动态代理还要从 JDK 本身说起. 在 Jd ...

随机推荐

  1. ComponentOne Xuni助力Xamarin开发者突破百万,快速开发Android、IOS Apps

    在微软Build 2015上,随着VS 2015的预览版发布,Xamrine免费版已经作为VS 2015跨平台移动解决方案的核心.与此同时,Xamarin官方也宣布其用户量达到百万之多.2011年7月 ...

  2. 解决TCP网络传输粘包问题

    很久之前就想写一写关于TCP粘包处理的文章了,无奈一直做WEB开发 没时间研究那个,拖了很久,最近要为一个客户做winform 服务器端,要用到SOCKET就发现了这个问题,这才想起来要解决. 下面用 ...

  3. paip.java 多线程参数以及返回值Future FutureTask 的使用.

    paip.java 多线程参数以及返回值Future FutureTask 的使用. 在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果. 所以run的返回值是vo ...

  4. iOS-APP发布应注意要点

    Android和IOS的app发布的流程有一个相同之处,就是都需要先将编译好的app签名,然后上传到market里,但两者的复杂度是冰火两重天.Android可以手动通过集成在eclipse里的工具进 ...

  5. 使用eclipse JDT compile class,解决 无法确定 X 的类型参数;对于上限为 X,java.lang.Object 的类型变量 X,不存在唯一最大实例

    ant 命令行方式执行build javac编译class出现 泛型无法转换 无法确定 <X>X 的类型参数:对于上限为 X,java.lang.Object 的类型变量 X,不存在唯一最 ...

  6. C语言:stat,fstat和lstat函数

    这三个函数的功能是一致的,都用于获取文件相关信息,但应用于不同的文件对象.对于函数中给出pathname参数,stat函数返回与此命名文件有关的信息结构,fstat函数获取已在描述符fields上打开 ...

  7. GTD时间管理(2)---管理收集箱

    通过上面一篇文章,相信大家对GTD收集有了原理大致的了解,如果大家对收集不是很了解,可以去看一下. 当我们收集到很多想法和事情之后,在晚会的时候必须要清空收集箱,否则收集箱会堆积如山,最终收集箱成了垃 ...

  8. Ubuntu虚拟机JeOS安装-2016.08.28

    根据官网的说明JeOS的镜像已经在官方不发行了,所以你在别的帖子里看到的安装jeos的镜像地址已经不适用了. 那么应该如何安装这种最小版本的linux操作系统呢? 其一,如果想要安装老版本的jeos系 ...

  9. Form 表单中的Input元素回车时不保存表单

    在Form表单中如果直接在Input元素里敲回车键,那么默认将提交表单,可以通过keydown事件取消默认此操作 $("form").live('keydown',function ...

  10. eoe移动开发社区创始人兼CEO靳岩:开发者缺极客精神

    (国内知名Android开发论坛eoe开发者社区推荐:http://www.eoeandroid.com/)       [媒体专稿]移动互联网在中国的深入发展已经有5.6个年头,从当初苹果推出iPh ...