深入浅出RxJava(三:响应式的好处)
在第一篇中,我介绍了RxJava的基础知识。第二篇中,我向你展示了操作符的强大。但是你可能仍然没被说服。这篇里面,我讲向你展示RxJava的其他的一些好处,相信这篇足够让你去使用Rxjava.
错误处理
到目前为止,我们都没怎么介绍onComplete()和onError()函数。这两个函数用来通知订阅者,被观察的对象将停止发送数据以及为什么停止(成功的完成或者出错了)。
下面的代码展示了怎么使用这两个函数:
Observable.just("Hello, world!").map(s -> potentialException(s)).map(s -> anotherPotentialException(s)).subscribe(new Subscriber<String>() {@Overridepublic void onNext(String s) { System.out.println(s); }@Overridepublic void onCompleted() { System.out.println("Completed!"); }@Overridepublic void onError(Throwable e) { System.out.println("Ouch!"); }});
代码中的potentialException() 和 anotherPotentialException()有可能会抛出异常。每一个Observerable对象在终结的时候都会调用onCompleted()或者onError()方法,所以Demo中会打印”Completed!”或者”Ouch!”。
这种模式有以下几个优点:
1.只要有异常发生onError()一定会被调用
这极大的简化了错误处理。只需要在一个地方处理错误即可以。
2.操作符不需要处理异常
将异常处理交给订阅者来做,Observerable的操作符调用链中一旦有一个抛出了异常,就会直接执行onError()方法。
3.你能够知道什么时候订阅者已经接收了全部的数据。
知道什么时候任务结束能够帮助简化代码的流程。(虽然有可能Observable对象永远不会结束)
我觉得这种错误处理方式比传统的错误处理更简单。传统的错误处理中,通常是在每个回调中处理错误。这不仅导致了重复的代码,并且意味着每个回调都必须知道如何处理错误,你的回调代码将和调用者紧耦合在一起。
使用RxJava,Observable对象根本不需要知道如何处理错误!操作符也不需要处理错误状态-一旦发生错误,就会跳过当前和后续的操作符。所有的错误处理都交给订阅者来做。
调度器
假设你编写的Android app需要从网络请求数据(感觉这是必备的了,还有单机么?)。网络请求需要花费较长的时间,因此你打算在另外一个线程中加载数据。那么问题来了!
编写多线程的Android应用程序是很难的,因为你必须确保代码在正确的线程中运行,否则的话可能会导致app崩溃。最常见的就是在非主线程更新UI。
使用RxJava,你可以使用subscribeOn()指定观察者代码运行的线程,使用observerOn()指定订阅者运行的线程:
myObservableServices.retrieveImage(url).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(bitmap -> myImageView.setImageBitmap(bitmap))
是不是很简单?任何在我的Subscriber前面执行的代码都是在I/O线程中运行。最后,操作view的代码在主线程中运行.
最棒的是我可以把subscribeOn()和observerOn()添加到任何Observable对象上。这两个也是操作符!。我不需要关心Observable对象以及它上面有哪些操作符。仅仅运用这两个操作符就可以实现在不同的线程中调度。
如果使用AsyncTask或者其他类似的,我将不得不仔细设计我的代码,找出需要并发执行的部分。使用RxJava,我可以保持代码不变,仅仅在需要并发的时候调用这两个操作符就可以。
订阅(Subscriptions)
当调用Observable.subscribe(),会返回一个Subscription对象。这个对象代表了被观察者和订阅者之间的联系。
Subscription subscription = Observable.just("Hello, World!").subscribe(s -> System.out.println(s));
你可以在后面使用这个Subscription对象来操作被观察者和订阅者之间的联系.
subscription.unsubscribe(); System.out.println("Unsubscribed=" + subscription.isUnsubscribed()); // Outputs "Unsubscribed=true"
RxJava的另外一个好处就是它处理unsubscribing的时候,会停止整个调用链。如果你使用了一串很复杂的操作符,调用unsubscribe将会在他当前执行的地方终止。不需要做任何额外的工作!
总结
记住这个系列仅仅是对RxJava的一个入门介绍。RxJava中有更多的我没介绍的功能等你探索(比如backpressure)。当然我也不是所有的代码都使用响应式的方式–仅仅当代码复杂到我想将它分解成简单的逻辑的时候,我才使用响应式代码。
如果你想学到更多,我建议你阅读RxJava的官方wiki。
转载于:https://www.cnblogs.com/itplay/p/10047938.html
深入浅出RxJava(三:响应式的好处)相关推荐
- Android【Retrofit(HTTP客户端),RxJAVA(响应式编程)】
1 Retrofit(HTTP客户端) 1.1 简介 我们项目当中的每个app都需要用到网络和服务器进行交互,在Android项目开发中使用HTTP协议完成通信的话,基本上都要用到OkHttp或者Re ...
- 移动Web开发--学习笔记三 响应式项目实战(微金所)
响应式项目实战(微金所) 响应式项目开发流程 选择一种屏幕格式进行开发 相应功能模块完成后,测试是否响应式效果 确保响应式效果满足要求 进行下一个功能模块开发 使用自定义字体图标 创建自己的字体图标h ...
- 响应式web(三):服务当中的三种耦合,流式计算,RXJava2,Flux,Mono
响应式 Web 第三节 服务调用中的三种耦合 响应式流规范与接口 响应式流中的流量控制 Web中的响应式与请求/响应式的区别 流式处理中的Source/Sink模型 RXJava2 观察者模式同步与异 ...
- 使用Spring Boot和RxJava的构建响应式REST API
点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 我不打算解释什么是响应式编程,也不解释为什么要使用它.我希望你已经在其他地方了解过,如果没有 ...
- Flutter 响应式框架RxDart学习
一.rxdart是什么? rx有个外号叫从入门到放弃 RxDart就是一个响应式编程,与之相关的还有他自己的全家桶(RxKotlin,RxJava,RxJS,RxSwift-)... RxDart 是 ...
- 浅谈RSocket与响应式编程
简介: RSocket是高效一个二进制的网络通讯协议,能够满足很多场景下使用.另外,RSocket也是一个激进的响应式捍卫者,激进到连API都跟响应式无缝集成.本文我们将和大家分享RSocket与响应 ...
- (11)照虎画猫深入理解响应式流规范——响应式Spring的道法术器
本系列其他文章见:<响应式Spring的道法术器>. 前情提要:响应式流 | Reactor3快速上手 2 响应式编程之法 上一章本着"快速上手"的原则,介绍了响应式流 ...
- WebFlux基础之响应式编程
上篇文章,我们简单的了解了WebFlux的一些基础与背景,并通过示例来写了一个demo.我们知道WebFlux是响应式的web框架,其特点之一就是可以通过函数式编程方式配置route.另外究竟什么是响 ...
- 【响应式编程的思维艺术】 (2)响应式Vs面向对象
[摘要]本文是Rxjs 响应式编程-第一章:响应式这篇文章的学习笔记. 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 划重点 三句非常重要的话: ...
最新文章
- 他是第一个到达学校的人英语_日本留学:不需要英语成绩的大学盘点·私立学部篇(第三弹)...
- 领英1000多个假账户被曝光,用AI生成假脸冒充真人发推销信息,已形成相关产业链...
- Beyond Compare启动出错解决方案
- css中英文混合实现两端对齐
- intellij存放插件的路径(转载)
- HGE2D引擎按键消息分析
- vue-router各个属性的作用及用法
- 工作所思--IT新人
- 计算机设备管理程序在哪,设备管理器在哪里查找?如何打开?
- php mysql 用户修改_PHP+MYSQL实现用户的增删改查,mysql增删_PHP教程
- NVIDIA下载老版本驱动/CUDA/Video Codec SDK的链接
- 基于Java毕业设计房产客户信息管理系统源码+系统+mysql+lw文档+部署软件
- KEIL出现ERROR:L6002U时处理方法
- paxos算法java实现_Paxos算法——前世
- 一个普通人的震后十年
- 智能手机网页制作12个注意事项
- 微信无法连接到服务器1-10091,微信能登录但是被限制功能了怎么解封
- ubuntu 16.04和window双系统 启动项顺序修改
- es - elasticsearch - aggs - metrics - percentile_ranks
- JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK16特性讲解】