• 理解RxJava:(三)RxJava的优点


    理解RxJava:(三)RxJava的优点

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

    错误处理

    截至当前,我们一直都忽略onComplete()onError()方法。它们标志着Observable停止发出items以及原因(不管是成功地完成或是不可恢复的错误)。

    我们最初的Subscriber有能力监听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()都能抛出异常。每个Observable都以调用onCompleted()``onError()方法结束。正因为这样, 程序的输出要么是Completed!,要么是Ouch!(因为异常的抛出)

    关于这个的补充:

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

      这使得错误处理变得更简单。只需要在最后的时候在一个简单的方法中处理所有的错误即可。

    • 2.operators不需要处理异常

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

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

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

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

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

  • 相关阅读:
    元素绑定与非元素绑定
    窗口之间的交互,windows和自定义的窗口集合
    e.which
    prop()和attr()
    web动画
    $.proxy()和$.makeArray()
    匿名自执行函数报错
    页面适配
    gulp
    伪元素和伪类
  • 原文地址:https://www.cnblogs.com/JohnTsai/p/5704191.html
Copyright © 2020-2023  润新知