理解RxJava:(三)RxJava的优势

理解RxJava:(三)RxJava的优势

第一部分,讲解了RxJava的基本结构。在第二部分,展现了operators的强大之处。可是大家可能仍然没有被说服,也没有足够的理由信服。下面是一些能让你信服的RxJava框架的优势。html

 错误处理

截至当前,咱们一直都忽略onComplete()onError()方法。它们标志着Observable中止发出items以及缘由(不论是成功地完成或是不可恢复的错误)。java

咱们最初的Subscriber有能力监听onComplete()onError()事件。动手实现以下所示:react

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!(由于异常的抛出)git

关于这个的补充:github

  • 1.onError()方法在有异常在任意时候被抛出的时候被调用。编程

    这使得错误处理变得更简单。只须要在最后的时候在一个简单的方法中处理全部的错误便可。网络

  • 2.operators不须要处理异常多线程

    Observable链上抛出的任何异常均可以留给 Subscriber决定如何处理。由于onError()方法以前的异常都会被跳过。框架

  • 3.咱们能知道Subscriber完成接收items的时候。ide

    知道任务何时结束有助于代码的流动。

在错误处理上, 这个模式要比传统的错误处理简单得多。使用回调,必须在每一个回调中处理错误。不只仅是形成重复代码,也意味着每一个回调都须要知道如何处理错误,意味着你的回调代码和调用者高度耦合。

经过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。这表明着你的ObservableSubscriber之间的联系:

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翻译。转载请注明出处,并保留此段声明。

相关文章
相关标签/搜索