在第一篇中,我介绍了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(三:响应式的好处)相关推荐

  1. Android【Retrofit(HTTP客户端),RxJAVA(响应式编程)】

    1 Retrofit(HTTP客户端) 1.1 简介 我们项目当中的每个app都需要用到网络和服务器进行交互,在Android项目开发中使用HTTP协议完成通信的话,基本上都要用到OkHttp或者Re ...

  2. 移动Web开发--学习笔记三 响应式项目实战(微金所)

    响应式项目实战(微金所) 响应式项目开发流程 选择一种屏幕格式进行开发 相应功能模块完成后,测试是否响应式效果 确保响应式效果满足要求 进行下一个功能模块开发 使用自定义字体图标 创建自己的字体图标h ...

  3. 响应式web(三):服务当中的三种耦合,流式计算,RXJava2,Flux,Mono

    响应式 Web 第三节 服务调用中的三种耦合 响应式流规范与接口 响应式流中的流量控制 Web中的响应式与请求/响应式的区别 流式处理中的Source/Sink模型 RXJava2 观察者模式同步与异 ...

  4. 使用Spring Boot和RxJava的构建响应式REST API

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 我不打算解释什么是响应式编程,也不解释为什么要使用它.我希望你已经在其他地方了解过,如果没有 ...

  5. Flutter 响应式框架RxDart学习

    一.rxdart是什么? rx有个外号叫从入门到放弃 RxDart就是一个响应式编程,与之相关的还有他自己的全家桶(RxKotlin,RxJava,RxJS,RxSwift-)... RxDart 是 ...

  6. 浅谈RSocket与响应式编程

    简介: RSocket是高效一个二进制的网络通讯协议,能够满足很多场景下使用.另外,RSocket也是一个激进的响应式捍卫者,激进到连API都跟响应式无缝集成.本文我们将和大家分享RSocket与响应 ...

  7. (11)照虎画猫深入理解响应式流规范——响应式Spring的道法术器

    本系列其他文章见:<响应式Spring的道法术器>. 前情提要:响应式流 | Reactor3快速上手 2 响应式编程之法 上一章本着"快速上手"的原则,介绍了响应式流 ...

  8. WebFlux基础之响应式编程

    上篇文章,我们简单的了解了WebFlux的一些基础与背景,并通过示例来写了一个demo.我们知道WebFlux是响应式的web框架,其特点之一就是可以通过函数式编程方式配置route.另外究竟什么是响 ...

  9. 【响应式编程的思维艺术】 (2)响应式Vs面向对象

    [摘要]本文是Rxjs 响应式编程-第一章:响应式这篇文章的学习笔记. 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 划重点 三句非常重要的话: ...

最新文章

  1. 他是第一个到达学校的人英语_日本留学:不需要英语成绩的大学盘点·私立学部篇(第三弹)...
  2. 领英1000多个假账户被曝光,用AI生成假脸冒充真人发推销信息,已形成相关产业链...
  3. Beyond Compare启动出错解决方案
  4. css中英文混合实现两端对齐
  5. intellij存放插件的路径(转载)
  6. HGE2D引擎按键消息分析
  7. vue-router各个属性的作用及用法
  8. 工作所思--IT新人
  9. 计算机设备管理程序在哪,设备管理器在哪里查找?如何打开?
  10. php mysql 用户修改_PHP+MYSQL实现用户的增删改查,mysql增删_PHP教程
  11. NVIDIA下载老版本驱动/CUDA/Video Codec SDK的链接
  12. 基于Java毕业设计房产客户信息管理系统源码+系统+mysql+lw文档+部署软件
  13. KEIL出现ERROR:L6002U时处理方法
  14. paxos算法java实现_Paxos算法——前世
  15. 一个普通人的震后十年
  16. 智能手机网页制作12个注意事项
  17. 微信无法连接到服务器1-10091,微信能登录但是被限制功能了怎么解封
  18. ubuntu 16.04和window双系统 启动项顺序修改
  19. es - elasticsearch - aggs - metrics - percentile_ranks
  20. JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK16特性讲解】

热门文章

  1. 大量小文件存储提高效率要点详解
  2. ping github超时问题
  3. linux下c语言抓包库libpcap
  4. 【Linux网络编程】套接字简介
  5. 程序员智力面试题(一)
  6. python俄罗斯方块实训报告_Python_简易版俄罗斯方块
  7. sql server创建数据库与相关查询操作
  8. 鸿蒙os 2.0跑分,预装鸿蒙OS 2.0!华为MatePad Pro2跑分曝光:麒麟9000、8GB内存
  9. win7建立wifi热点
  10. CentOS挂载U盘