Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 377|回复: 0

[默认分类] 深入浅出RxJava三--响应式的好处

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-5-24 16:58:40 | 显示全部楼层 |阅读模式

    原文链接
    在第一篇中,我介绍了Rxjava的基础知识。第二篇中,我向你展示了操作符的强大。但是你可能仍然没被说服。这篇里面,我讲向你展示RxJava的其他的一些好处,相信这篇足够让你去使用Rxjava.
    错误处理
    到目前为止,我们都没怎么介绍onComplete()和onError()函数。这两个函数用来通知订阅者,被观察的对象将停止发送数据以及为什么停止(成功的完成或者出错了)。
    下面的代码展示了怎么使用这两个函数:

      

    1. potentialException(s))
    2.     .map(s -> anotherPotentialException(s))
    3.     .subscribe(new Subscriber() {
    4.         @Override
    5.         public void onNext(String s) { System.out.println(s); }
    6.         @Override
    7.         public void onCompleted() { System.out.println("Completed!"); }
    8.         @Override
    9.         public void onError(Throwable e) { System.out.println("Ouch!"); }
    10.     });" data-snippet-id="ext.f374b507efce50bd09206da9662eabfa" data-snippet-saved="false" data-csrftoken="IcHbADBS-1FEWP1RD93JUWrRFagOr-qvNVSc" data-codota-status="done">[code]Observable.just("Hello, world!")
    11.     .map(s -> potentialException(s))
    12.     .map(s -> anotherPotentialException(s))
    13.     .subscribe(new Subscriber<String>() {
    14.         @Override
    15.         public void onNext(String s) { System.out.println(s); }
    16.         @Override
    17.         public void onCompleted() { System.out.println("Completed!"); }
    18.         @Override
    19.         public void onError(Throwable e) { System.out.println("Ouch!"); }
    20.     });
    复制代码
    [/code]
    代码中的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()指定订阅者运行的线程:

      

    1. myImageView.setImageBitmap(bitmap));" data-snippet-id="ext.1fda4565f75cf740bba9b0668bb2929f" data-snippet-saved="false" data-csrftoken="NpcEFc9m-K19xPir04VAl2okXGHJ6CKxgEcY" data-codota-status="done">[code]myObservableServices.retrieveImage(url)
    2.     .subscribeOn(Schedulers.io())
    3.     .observeOn(AndroidSchedulers.mainThread())
    4.     .subscribe(bitmap -> myImageView.setImageBitmap(bitmap));
    复制代码
    [/code]
    是不是很简单?任何在我的Subscriber前面执行的代码都是在I/O线程中运行。最后,操作view的代码在主线程中运行.
    最棒的是我可以把subscribeOn()和observerOn()添加到任何Observable对象上。这两个也是操作符!。我不需要关心Observable对象以及它上面有哪些操作符。仅仅运用这两个操作符就可以实现在不同的线程中调度。
    如果使用AsyncTask或者其他类似的,我将不得不仔细设计我的代码,找出需要并发执行的部分。使用RxJava,我可以保持代码不变,仅仅在需要并发的时候调用这两个操作符就可以。
    订阅(Subscriptions)
    当调用Observable.subscribe(),会返回一个Subscription对象。这个对象代表了被观察者和订阅者之间的联系。

      

    1. System.out.println(s));" data-snippet-id="ext.69a22e2d6aa4f17ec3f44e9a4b90adae" data-snippet-saved="false" data-csrftoken="csuDz2NT-Yw8U12GgBNMbx5RbKVCmpsA6fHY" data-codota-status="done">[code]ubscription subscription = Observable.just("Hello, World!")
    2.     .subscribe(s -> System.out.println(s));
    复制代码
    [/code]
    你可以在后面使用这个Subscription对象来操作被观察者和订阅者之间的联系.

      

    1. [code]subscription.unsubscribe();
    2. System.out.println("Unsubscribed=" + subscription.isUnsubscribed());
    3. // Outputs "Unsubscribed=true"
    复制代码
    [/code]
    RxJava的另外一个好处就是它处理unsubscribing的时候,会停止整个调用链。如果你使用了一串很复杂的操作符,调用unsubscribe将会在他当前执行的地方终止。不需要做任何额外的工作!
    总结
    记住这个系列仅仅是对RxJava的一个入门介绍。RxJava中有更多的我没介绍的功能等你探索(比如backpressure)。当然我也不是所有的代码都使用响应式的方式–仅仅当代码复杂到我想将它分解成简单的逻辑的时候,我才使用响应式代码。
    最初,我的计划是这篇文章作为这个系列的总结,但是我收到许多请求我介绍在Android中使用RxJava,所以你可以继续阅读第四篇了。我希望这个介绍能让你开始使用RxJava。如果你想学到更多,我建议你阅读RxJava的官方wiki。

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-17 00:22 , Processed in 0.618489 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表