RxJava之响应式编程的好处

From:http://blog.danlew.net/2014/09/30/grokking-rxjava-part-3/

RxJava之响应式编程的好处_第1张图片

在上一篇文章当中,我们介绍了RxJava的一些的操作符的用法。但是你可能仍然没有被说服。在这篇文章中,我将向你展示RxJava的其他一些好处,相信这篇足够让你去使用RxJava.

错误处理

到目前为止,我们都没怎么介绍onComplete()和onError()函数。这两个函数用来通知订阅者,被观察的对象将停止发送数据以及怎么停止(成功的或者出错了)。

下面的代码展示了怎么使用这两个函数:

Observable.just("Hello,world!")

.map(s -> potentialExceptiom(s))

.map(s - > anotherPotentialException(s))

.subscribe(new Subscriber(){

@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("Error!");

}

});

代码中的potentialException()和anotherPotenetialExcepotion()有可能会抛出异常。每一个Observable对象在终结的时候都会调用onCompleted()或者onError()方法,所以以上的实例代码中会打印 ”Completed!“ 或者 "Error!" 。

这种模式有以下几个优点:

1、只要有异常发生,onError()一定被调用,这极大简化了错误处理。只要在一个地方处理错误即可。

2、操作符不需要处理异常,这里的异常处理会给订阅者来做,Observable的操作符调用链中一旦有一个抛出了异常,就会直接执行onError方法。

3、你能够知道什么时候订阅者已经接受了全部的数据,知道什么时候任务结束能够帮助简化代码的流程(虽然有可能Observable对象永远不会结束)。我觉得这种错误处理方式比传统的错误处理更简单。传统的错误处理中,通常是在每个回调中处理错误。这不仅导致了重复的代码,并且意味着每个回调都必须知道如何处理错误 ,你的回调代码和调用者紧紧的耦合在了一起。

使用RxJava,Observable对象根本不需要知道如何处理错误!操作符也不需要处理错误状态,一旦发生错误,就会跳过当前和后续的操作符。所有的错误处理都交给订阅者来做。

调度器

假设你编写的Android app需要从网络请求数据(感觉这是必备的了,还有单机?)。网络请求需要花费较长的时间,因此你打算在另外一个线程中加载数据,那么问题来了!

编写多线程的Android应用程序是很难的,因为你必须确保代码在正确的线程中运行,否则的话,可能导致app崩溃,最常见的就是在非主线更新UI。

使用RxJava,你可以使用subscribeOn()指定观察者代码运行的线程,使用observerOn()指定订阅者运行的线程:

myObservableServides.retrieveImage(url)

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(bitmap - > myImageView.setImageBitmap(bitmap));

是不是很简单?任何在我的Subscribe前面只想的代码都是在I/O线程中运行。最后,操作view的代码在主线程中运行。

最棒的是,我可以把subscribeOn()和observerOn()添加到任何Observable对象上。这两个也是操作符!我不需要关心Observabke对象以及它上面有哪些操作符。仅仅运用这两个操作符就可以实现在不同线程中调度。

如果使用AsynTask或者其他类似的,我将不得不仔细设计我的代码,找出需要并发执行的部分。使用RxJava,我可以保持代码不变,仅仅在需要并发的时候,调用这两个操作符就可以。

订阅(Subscriptions)

当调用Observable.subscribe(),会返回一个Subscription对象。这个对象代表了被观察者和订阅者之间的联系。

Subscription subscription = Observable.just("Hello,world!")

.subscribe(s - > System.out.println(s));

你可以在后面使用这个Subscription对象来操作被观察者和订阅之间的联系。

subscription.unsubscribe();

RxJava的另外一个好处就是它处理unsubscribing的时候,它会停止整个调用链。如果你使用了一串很复杂的操作符,调用unsubscribe将会在他当前执行的地方终止。不需要做任何额外的工作!

总结

记住这个系列仅仅是对RxJava的一个入门介绍。RxJava中有更多我没有介绍的功能等你探索(比如 backpressure)。当然,我也不是所有的代码有使用响应式的方式,仅仅当代码复杂我将想将它分解成简单的逻辑的时候,我才使用响应式代码。

更多内容请关注我的个人微信公众号:前端开发技术栈

你可能感兴趣的:(RxJava之响应式编程的好处)