原文链接
在第一篇中,我介绍了RxJava的基础知识。第二篇中,我向你展示了操作符的强大。但是你可能仍然没被说服。这篇里面,我讲向你展示RxJava的其他的一些好处,相信这篇足够让你去使用Rxjava.
错误处理
到目前为止,我们都没怎么介绍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()有可能会抛出异常。每一个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对象。这个对象代表了被观察者和订阅者之间的联系。
ubscription 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)。当然我也不是所有的代码都使用响应式的方式–仅仅当代码复杂到我想将它分解成简单的逻辑的时候,我才使用响应式代码。
最初,我的计划是这篇文章作为这个系列的总结,但是我收到许多请求我介绍在Android中使用RxJava,所以你可以继续阅读第四篇了。我希望这个介绍能让你开始使用RxJava。如果你想学到更多,我建议你阅读RxJava的官方wiki。
分享到:
相关推荐
)深入浅出RxJava(三--响应式的好处)深入浅出RxJava(四-在Android中使用响应式编程)如何升级到RxAndroid1.0 -适合使用Rx 0.x版本的用户升级的时候参考可能是东半球最全的 RxJava 使用场景小结RxJava系列1(简介)...
首先,RxJava是一种响应式编程库,它为异步编程提供了简洁且强大的工具。响应式编程的核心理念是数据流(数据序列)和变化传播,允许开发者以声明式的方式处理事件和数据。RxJava提供了Observable(被观察者)和...
老罗是一位在IT领域有着丰富经验的技术讲师,以其独特的教学方式和深入浅出的讲解而闻名。他的课程不仅覆盖了理论知识,还注重实践操作,非常适合初学者快速上手并深入理解技术细节。 ### RxJava简介 RxJava是一种...
《给 Android 开发者的 RxJava 详解》这本书深入浅出地介绍了如何在 Android 开发环境中应用 RxJava 这个强大的响应式编程库。RxJava 是一个用于处理异步数据流和事件流的库,它引入了函数式编程的概念,使得复杂的...
《Learning Reactive Programming with Java 8》不仅深入浅出地介绍了反应式编程的基本原理,还提供了丰富的实战案例,非常适合希望深入了解并掌握Java 8反应式编程技术的开发者阅读。通过学习本书,开发者可以更好...
《Android网络开发与应用实战详解》一书深入浅出地介绍了Android系统中如何实现网络通信,并提供了丰富的源码示例。这本书涵盖的内容广泛,包括基础的HTTP请求、数据解析、网络状态管理以及高级的WebSocket通信和...
在Mars的视频教学中,他将这些知识点结合实际案例进行深入浅出的讲解,并提供了相应的源码供学习者实践。通过对照源码学习,可以加深对每个知识点的理解,提高实际开发中的问题解决能力。对于想要系统学习Android...
《Android开发艺术探索》这本书是Android开发者们非常推崇的一本技术书籍,它深入浅出地讲解了Android开发的各种技术和实践。这份"《Android开发艺术探索》源码.zip"压缩包包含的是书中所有章节的源代码,这对于学习...
深入浅出Android Support Annotations Android Support Annotations是Android开发中的一个库,它提供了各种注解来帮助开发者在编译时期发现潜在的错误。这些注解可以用于方法参数、返回值、字段等,以标记数据的使用...
总的来说,"小马哥Java技术周报"是Android开发者保持技术敏锐度、提升技能的重要资源,它通过深入浅出的讲解,帮助开发者掌握Android开发的核心技术和最新动态。通过学习这份周报,开发者不仅可以提升个人技术水平,...
《台湾高人高焕堂Android完整讲义》是一份深入浅出的Android开发教程,涵盖了Android平台的基础知识、核心框架结构解析以及高级整合开发技术。这份讲义旨在帮助开发者全面理解Android系统的运作机制,提升在Android...
李兴华老师是Android开发领域的知名专家,他的讲解深入浅出,实践性强,适合初学者和有一定经验的开发者学习。 在PPT课件中,我们可以预见到以下几个关键知识点的详细讲解: 1. **Android系统架构**:首先,课件...
在Android开发领域,火星(Mars)的Android视频教程因其深入浅出、实战性强而备受开发者喜爱。这个教程的源代码覆盖了最新的前三季内容,旨在帮助学习者从基础到进阶,全面掌握Android应用开发的关键技能。以下是...
在本书中,作者深入浅出地讲解了Android开发的基础知识,包括Android应用程序架构、UI设计、数据存储、网络通信、多媒体处理、传感器应用等关键领域。每个章节都配有相应的案例,这些案例的源码包含在"各章案例"中,...
《Android应用开发详解》这本书是Android开发者们的重要参考资料,它深入浅出地讲解了Android应用开发的各个环节。配套光盘中的源代码则是书本理论知识的实践体现,为读者提供了丰富的实例,帮助理解和掌握Android...
《Android应用开发揭秘》是一本深受开发者欢迎的书籍,它深入浅出地讲解了Android应用开发的各个环节,从基础到高级,涵盖了丰富的知识点。源码是书籍内容的实践部分,对于学习者来说,通过阅读和分析这些源码,能够...
这本书深入浅出地讲解了Android应用中的多线程技术,帮助开发者提升应用性能,避免常见陷阱,以及优化用户体验。 在Android系统中,由于其独特的运行环境和硬件限制,正确理解和运用线程管理至关重要。本书首先会...
### 第二章 注解深入浅出 **注解(ANNOTATIONS)** 注解在Java中用于提供元数据,可以用于声明、描述或修改程序的行为和属性。在Android开发中,注解常用于简化代码、数据绑定以及与依赖注入框架如Dagger集成。 *...