理解RxJava:(三)RxJava的优点
理解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
。这代表着你的Observable
和Subscriber
之间的联系:
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的优点的更多相关文章
- RX系列三 | RxJava | create | from | interval | just | range | filter
RX系列三 | RxJava | create | from | interval | just | range | filter 我们在第一篇里有说过一些基本的关系,现在我们需要用到一些依赖,这里记 ...
- 深入理解OOP(三):多态和继承(动态绑定和运行时多态)
在前面的文章中,我们介绍了编译期多态.params关键字.实例化.base关键字等.本节我们来关注另外一种多态:运行时多态, 运行时多态也叫迟绑定. 深入理解OOP(一):多态和继承(初期绑定和编译时 ...
- Java 反射理解(三)-- Java获取方法信息
Java 反射理解(三)-- Java获取方法信息 基本的数据类型.void关键字,都存在类类型. 举例如下: public class ClassDemo2 { public static void ...
- 简单理解Hibernate三种状态的概念及互相转化
本文描述了Hibernate三种状态的概念及互相转化.Java对象的生命周期中有三种状态,而且互相转化.它们分别是临时状态,持久化状态,以及游离状态. AD:WOT2015 互联网运维与开发者大会 热 ...
- 学习C++ Primer 的个人理解(三)
第三章,主要内容是字符串和数组.感觉作者的意图是希望读者可以早一点可以写出简单的小程序,并且可以早点接触迭代器这种思想. 在我看来,这种内容的难度并不大. 对于编程来说,最重要的应该是思想,类似vec ...
- 关于SVM数学细节逻辑的个人理解(三) :SMO算法理解
第三部分:SMO算法的个人理解 接下来的这部分我觉得是最难理解的?而且计算也是最难得,就是SMO算法. SMO算法就是帮助我们求解: s.t. 这个优化问题的. 虽然这个优化问题只剩下了α这一个变 ...
- 深入理解JVM(三)垃圾收集器和内存分配策略
3.1 关于垃圾收集和内存分配 垃圾收集和内存分配主要针对的区域是Java虚拟机中的堆和方法区: 3.2 如何判断对象是否“存活”(存活判定算法) 垃圾收集器在回收对象前判断其是否“存活”的两个算法: ...
- 对HashMap的理解(三):ConcurrentHashMap
HashMap不是线程安全的.在并发插入元素的时候,有可能出现环链表,让下一次读操作出现死循环.避免HashMap的线程安全问题有很多方法,比如改用HashTable或Collections.sync ...
- Spring深入理解(三)
Spring 中 AOP 特性详解 动态代理的实现原理 要了解 Spring 的 AOP 就必须先了解动态代理的原理,因为 AOP 就是基于动态代理实现的.动态代理还要从 JDK 本身说起. 在 Jd ...
随机推荐
- Nutz Dao实体中索引注解的使用(@TableIndexes@Index)
Nutz是一组轻便小型的框架的集合, 各个部分可以被独立使用,把SSH的精华封装在一个1M左右的jar包中,Nutz不对其他任何第三方库产生依赖,如果不考虑数据库链接和日志的话,创建完美的Web应用只 ...
- 微软MSDN订阅用户已可提前手工下载Windows 10安装包
在Windows 10发布之夜,当全世界都在翘首以盼Windows 10免费发布推送的到来,MSDN订阅用户可以立马享受一项令人项目的特殊待遇:手工下载Windows 10完整安装包+免费使用的激活密 ...
- Node.js 爬虫,自动化抓取文章标题和正文
持续进行中... 目标: 动态User-Agent模拟浏览器 √ 支持Proxy设置,避免被服务器端拒绝 √ 支持多核模式,发挥多核CPU性能 √ 支持核内并发模式 √ 自动解码非英文站点,避免乱码出 ...
- java web开发 图片上传功能
基本思路在于,配置路径,然后用java I/O的api将图片上传到该目录下. String photoPath = ServletActionContext.getServletContext( ...
- paip.杀不死进程的原因--僵尸进程的解决.txt
paip.杀不死进程的原因--僵尸进程的解决.txt 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn ...
- 重新签名IPA ( iPhone )
提示:暂时不能用了,企业证书滥用 ios 企业证书 ipa 重新签名发布 1. 应用场景 当前有一个 未用企业证书签名的 ipa 文件,默认是不可以直接安装到设备上的:我们需要用企业版证书签名: 当前 ...
- 如何保证access_token长期有效
为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等,开发者在调用这些接口时,都需要传入一个相 ...
- JSP取得绝对路径
在JavaWeb开发中,常使用绝对路径的方式来引入JavaScript和CSS文件,这样可以避免因为目录变动导致引入文件找不到的情况,常用的做法如下: 一.使用${pageContext.reques ...
- Linux内核如何装载和启动一个可执行程序
exec 本节我们分析exec系统调用的执行过程. exec一般和fork调用,常规用法是fork出一个子进程,然后在子进程中执行exec,替换为新的代码. do_exec 跟上次的fork类似,这里 ...
- Spark随机森林实现学习
前言 最近阅读了spark mllib(版本:spark 1.3)中Random Forest的实现,发现在分布式的数据结构上实现迭代算法时,有些地方与单机环境不一样.单机上一些直观的操作(递归),在 ...