RxJava入门系列三,响应式编程

RxJava入门系列三,响应式编程

在RxJava入门系列一,我向你介绍了RxJava的基础架构.RxJava入门系列二,我向你展示了RxJava提供的多种牛逼操作符.但是你可能仍然没能劝服自己使用RxJava,这一篇博客里我将向你展示RxJava提供的其他优势,没准了解了这些优势,你就真的想去使用RxJava了.


异常处理

直到目前为止,我都没有去介绍onComplete()和onError()方法.这两个方法是用来停止Observable继续发出事件并告知观察者为什么停止(是正常的停止还是因为发生了错误而停止).

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()方法都会被回调.

    这使得异常处理变得非常简单,我只需要在onError()方法中做异常处理即可.

  2. 操作符不需要去处理异常.

    将异常交给Subscriber去处理,这样Observable的链式调用一旦出了异常,就会直接执行Subscriber的onError()方法.

  3. 你可以知道Subscriber什么时候已经接收完全部的信息.

    知道什么时候事件发出结束可对你代码的流程调用有很大的帮助.

我发现RxJava这种异常处理模式比传统的异常处理模式简单.在传统的异常处理模式中,你通过需要设置回调函数来处理错误异常.这样做不仅会导致大量重复代码的存在,而且还意味着每个回调函数都需要清楚自己需要处理哪种错误异常,意味着异常回调处理函数和调用者紧耦合.

使用RxJava,你的Observable对象根本不需要知道如何处理错误和异常,你的链式调用中的操作符也不需要知道如何处理异常,一旦发生运行时错误,就会跳过操作符,将错误交给Subscriber去处理.


调度器

你编写的Android应用肯定会有发送网络请求的代码.发送网络请求是一个非常耗时操作,所以你希望在子线程中建立连接拉取数据.这个时候,问题就来了.

编写Android多线程程序是很难的,因为你必须明确哪部分代码应该运行在哪个线程上,否则你的应用很有可能会崩溃.一个典型的崩溃案例就是:当你试图从非主线程去修改View时Android系统就会报错.

在RxJava中,你可以使用subscribeOn()方法告知Observable对象代码运行在哪个线程上,同时可以使用observeOn()方法告知Subscriber对象代码运行在哪个线程上:

myObservableServices.retrieveImage(url)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(bitmap -> myImageView.setImageBitmap(bitmap));

是不是很简单?在subscriber之前的代码都是运行在io线程中,subscriber代码运行在主线程中,所以最后myImageView能够在主线程中更新自己的UI.

最屌的就是我可以把subscribeOn()和observeOn()添加到任意Observable对象上!它俩也是操作符!我不需要关心Observable和它之前的操作符,仅仅通过这两个操作符就能让我轻松的实现线程调度.

使用AsyncTask或者类似的异步框架,我必须设计我的代码,找出哪部分代码是需要并发执行的.但是使用RxJava,我的代码可以保持不变,我只需要在线程调度的地方添加那两个操作符即可.


订阅

在之前的博客里我向你隐瞒了一件事情.当你调用Observable.subscribe()方法时,返回的其实是Subscription对象.它代表了Observable和Subscriber之间的订阅关系.

Subscription subscription = Observable.just("Hello, World!")
    .subscribe(s -> System.out.println(s));

你可以使用Subscription对象来取消Subscriber对Observable的订阅关系:

subscription.unsubscribe();
System.out.println("Unsubscribed=" + subscription.isUnsubscribed());
// Outputs "Unsubscribed=true"

这是RxJava又一个非常赞的功能,当你使用Subscription取消订阅时,会停止整个Observable的链式调用.如果你有一系列非常复杂的链式操作符调用,使用unsubscribe方法会立刻停止正在执行的链式调用代码,你不需要在做其他额外的工作.


总结

记住这个仅仅是RxJava的入门系列.RxJava有太多你需要去学习的功能和实现细节(例如背压).我也不是使用RxJava来实现全部的代码,我仅仅是当代码复杂到一定程度需要将其简化时才会使用RxJava.

原本我计划这篇文章作为RxJava入门系列的终结篇,但是我收到很多留言希望我能介绍一下RxJava如何在Android中具体使用.因此,我继续写了RxJava入门篇四.我希望通过这一系列教程的讲解能够打动你开始使用RxJava这个有趣的框架.


原文链接

Grokking RxJava, Part 3: Reactive with Benefits

时间: 2024-08-02 06:56:25

RxJava入门系列三,响应式编程的相关文章

RxJS入门之函数响应式编程

一.函数式编程 1.声明式(Declarativ) 和声明式相对应的编程?式叫做命令式编程(ImperativeProgramming),命令式编程也是最常见的?种编程?式. //命令式编程: function double(arr) { const results = [] for (let i = 0; i < arr.length; i++){ results.push(arr[i] * 2) } return results } function addOne(arr){ const r

响应式编程系列(一):什么是响应式编程?reactor入门

响应式编程 系列文章目录 (一)什么是响应式编程?reactor入门 (二)Flux入门学习:流的概念,特性和基本操作 (三)Flux深入学习:流的高级特性和进阶用法 (四)reactor-core响应式api如何测试和调试? (五)Spring reactive: Spring WebFlux的使用 (六)Spring reactive: webClient的使用 引言 Spring framework 5 的一大新特性:响应式编程(Reactive Programming).那么什么是响应式

(10)响应式宣言、响应式系统与响应式编程——响应式Spring的道法术器

本系列文章索引<响应式Spring的道法术器>前情提要 响应式编程 | 响应式流 1.5 响应式系统 1.5.1 响应式宣言 关注"响应式"的朋友不难搜索到关于"响应式宣言"的介绍,先上图: 这张图凝聚了许多大神的智慧和经验,见官网,中文版官网,如果你认可这个宣言的内容,还可以签下你的大名.虽然这些内容多概念而少实战,让人感觉是看教科书,但是字字千金,不时看一看都会有新的体会和收获. 这也是新时代男朋友的行为准则: Responsive,要及时响应,24

RxJava入门系列四,Android中的响应式编程

RxJava入门系列四,Android中的响应式编程 在入门系列1,2,3中,我基本介绍了RxJava是如何使用的.但是作为一名Android开发人员,你怎么让RxJava能为你所用呢?这篇博客我将针对Android开发来介绍一下RxJava的使用场景. RxAndroid RxAndroid是为Android打造的RxJava扩展.通过RxAndroid可以让你的Android开发变得更轻松. 首先,RxAndroid中提供了AndroidSchedulers,你可以用它来切换Android线

Spring5.0响应式编程入门

引言? 响应式编程是一种面向数据流和变化传播的编程范式.使用它可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播.我们可以使用声明的方式构建应用程序的能力,形成更加敏感和有弹性的应用,所以Spring 5在其核心框架中增加了反应系统,已经开始向声明式编程的范式转变. 响应式编程的优势 提高了代码的可读性,因此开发人员只需要关注定义业务逻辑. 在高并发环境中,可以自然的处理消息. 可以控制生产者和消费者之间的流量,避免内存不足. 对于一个或多个线程,

Rx系列---响应式编程

Rx是ReactiveX的简称,翻译过来就是响应式编程 首先要先理清这么一个问题:Rxjava和我们平时写的程序有什么不同.相信稍微对Rxjava有点认知的朋友都会深深感受到用这种方式写的程序和我们一般写的程序有很明显的不同.我们一般写的程序 统称为命令式程序,是以流程为核心的,每一行代码实际上都是机器实际上要执行的指令.而Rxjava这样的编程风格,称为函数响应式编程.函数响应式编程是以数据流为核心,处理数据的输入,处理以及输出的.这种思路写出来的代码就会跟机器实际执行的指令大相径庭.所以对于

RxJava响应式编程之初级了解

据说现在流行的开发模式是 Retrofit+RxJava+MVP+ButterKnife 如果想要简单学习ButterKnife.MVP模式,可以参考我以前的例子 使用butterknife注解框架 Android-MVP设计模式高级(三) 今天我就简单来学习下RxJava的相关知识 以前我也只是听说过RxJava,RxJava这个到底是什么东西呢? 呵呵,它其实是一个库,所以我们使用里面的方法,得需要下载库,所以我们需要在AS中进行配置 1.RxJava 地址以及添加 github地址: ht

1小时让你掌握响应式编程,并入门Reactor

我看同步阻塞 “你知道什么是同步阻塞吗”,当然知道了.“那你怎么看它呢”,这个... 在同步阻塞的世界里,代码执行到哪里,数据就跟到哪里.如果数据很慢跟不上来,代码就停在那里等待数据的到来,然后再带着数据一起往下执行. 可以说是,代码执行和数据是结伴而行,不离不弃.执子之手与子偕老.让人老感动了. 如果还不太理解的话,可以认为代码执行其实就是一些行为动作,这些行为动作的目的就是为了获取/操作数据. 例如加法,这里的行为动作就是执行相加,数据就是加数和被加数.操作结果就是得到了另一个数据,即两个数

Unity基于响应式编程(Reactive programming)入门

系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoTween&Unity Native2D实现 时光煮雨 Unity3D实现2D人物动画① UGUI&Native2D序列帧动画 时光煮雨 Unity3D实现2D人物动画② Unity2D 动画系统&资源效率 背景 前有慕容小匹夫的一篇<解构C#游戏框架uFrame兼谈游戏架构设计&