
RxJava入门
文章平均质量分 94
RxJava 是由大名鼎鼎的 Netflix 公司在开发软件过程中应用 Rx.NET 思想解决实际问题,并最总提炼出来的一套应用于 Java 的 Rx 框架。Rx 是一个优雅解决问题的框架,functional programmer 对该框架比较熟悉。
一叶飘舟
目标赋予我们生命的意义和目的。有了目标,我们才会把注意力集中在追求喜悦,而不是在避免痛苦上。(急需找我,加微信:jdsjlzx)
展开
-
RxJava 错误处理操作符(Error Handling Operators)
在Observable发射数据时,有时发送onError通知,导致观察者不能正常接收数据。可是,有时我们希望对Observable发射的onError通知做出响应或者从错误中恢复。此时我们该如何处理呢?解决办法就是使用Error handling相关的操作符来集中统一地处理错误。RxJava中错误处理的操作符为 Catch和 Retry。Catch Catch操作符能够拦截原始Observable原创 2016-09-06 11:10:57 · 11078 阅读 · 0 评论 -
RxJava的懒加载,慎重使用自定义操作符,优先考虑内置操作符
我越来越喜欢把RxJava的defer()操作符作为一个工具来使用,以确保Observable代码在被订阅后才执行(而不是创建后立即执行)。我之前写过一些有关defer()的代码,但是,现在我想做更详细的描述。假设,有个数据类:public class SomeType { private String value;public void setValue(String value) { t转载 2016-09-02 13:58:14 · 1914 阅读 · 0 评论 -
RxJava 合并组合两个(或多个)Observable数据源
关键词:合并 Observable前言在RxJava中, 同时处理多个Observables是很常见的一种操作。下面我们简单分析下几个组合类的操作符。Merge在异步的世界经常会创建这样的场景,我们有多个来源但是只想有一个结果:多输入,单输出。RxJava的merge()方法将帮助你把两个甚至更多的Observables合并到他们发射的数据里。下图给出了把两个序列合并在一个最终发射的Observab原创 2016-09-02 17:16:16 · 76350 阅读 · 6 评论 -
RxJava Android(RxAndroid) 开发全家桶
RxJava 在 Android 应用开发中越来越流行,但是由于其门槛稍高,初次使用不免遇到很多问题,例如在 RxJava 常见的错误用法 和 不该使用 RxJava 的一些情况 中所描述的情况。为了避免这些常见的问题,很多民间高手开发了很多在 Android 应用中可以使用的 Rx 扩展类库,组合使用这些类库,可以更方便的使用 RxJava 并且可以避免一些常见的错误用法。 本文来介绍一些使用 R转载 2016-08-03 23:38:31 · 7102 阅读 · 0 评论 -
理解RxJava的线程模型
ReactiveX是Reactive Extensions的缩写,一般简写为Rx,最初是LINQ的一个扩展,由微软的架构师Erik Meijer领导的团队开发,在2012年11月开源,Rx是一个编程模型,目标是提供一致的编程接口,帮助开发者更方便的处理异步数据流,Rx库支持.NET、JavaScript和C++,Rx近几年越来越流行了,现在已经支持几乎全部的流行编程语言了,Rx的大部分语言库由Rea转载 2016-08-02 11:15:13 · 2163 阅读 · 0 评论 -
RxJava 自定义操作符(实现自己的操作符)
你可以实现你自己的Observable操作符,本文展示怎么做。如果你的操作符是被用于创造一个Observable,而不是变换或者响应一个Observable,使用 create( ) 方法,不要试图手动实现 Observable。另外,你可以按照下面的用法说明创建一个自定义的操作符。如果你的操作符是用于Observable发射的单独的数据项,按照下面的说明做:Sequence Operators 。原创 2016-07-29 09:30:18 · 3379 阅读 · 0 评论 -
使用 RxJava 从多种来源中加载数据
假设我需要从网络上查询一些数据。显然我可以在每次需要时都从网络上查询,但是将数据缓存在硬盘和内存中将更加高效。具体点说,我想要这么做:1.只有在需要从服务器更新数据的时候,才通过网络查询。2.其他情况则从通过缓存之前查询的数据,实现快速的读取。接下来,我将通过使用 RxJava 来实现上面的想法。基本模式为每一个数据源(网络、磁盘和内存)准备一个Observable ,然后我们就可以通过使用conc转载 2016-07-28 10:52:52 · 3012 阅读 · 0 评论 -
RxJava 并发之数据流发射太快如何办(背压(Backpressure))
RxJava系列教程:1. RxJava使用介绍 【视频教程】 2. RxJava操作符 • Creating Observables(Observable的创建操作符) 【视频教程】 • Transforming Observables(Observable的转换操作符) 【视频教程】 • Filtering Observables(Observable的过滤操原创 2016-07-09 21:18:38 · 16638 阅读 · 1 评论 -
RxJava 并发之意外情况处理
Rx 尽量避免状态泄露到数据流之外的场景。但是有些东西本身就带有状态。比如服务器可以上线和离线、手机可以访问Wifi、按钮被按下了等。在 Rx 中国,我们在一段时间内看到这些事件,并称之为窗口(window)。其他事件在这个窗口内发生可能需要特殊处理。例如,手机在使用移动收费上网的时候,会把网络请求优先级降低,来避免天价流量费的情况。 注意:上面的一段话估计是翻译的,有点语句不通。更多参考官网:转载 2016-07-09 11:12:40 · 3973 阅读 · 0 评论 -
RxJava 并发 之测试
在开发软件的时候,我们需要确保代码正确执行。为了快速的获取每次修改后的反馈,通常开发人员使用自定义测试。在同步的 Rx 中测试和普通 Java 中的单元测试没有太大的区别。如果要测试异步代码,可能会有点需要注意的地方,比如要测试下面的代码:Observable.interval(1, TimeUnit.SECONDS) .take(5)上面的 Observable 发射一个数据流,需要 5秒转载 2016-07-09 10:11:00 · 3278 阅读 · 0 评论 -
RxJava 并发之线程调度
由于 Rx 目标是用在异步系统上并且 Rx 支持多线程处理,所以很多 Rx 开发者认为默认情况下 Rx 就是多线程的。 其实实际情况不是这样的,Rx 默认是单线程的。除非你明确的指定线程,否则所有 onNext/onError/onCompleted 以及各个操作函数的调用都是在同一个线程中完成的。例如下面的示例:final BehaviorSubject<Integer> subject = Be转载 2016-07-08 23:21:04 · 8281 阅读 · 1 评论 -
RxJava 驯服数据流之自定义操作函数
RxJava 提供了很多操作函数。加上各种重载函数,一共有 300 多个操作函数。这些函数中只有很少一部分是核心的操作函数,离开这些核心的函数根本就没法使用 RxJava 了。其他的大部分函数只是一些便捷函数,方便开发者使用,并且他们的名字基本都说明了他们的用法。比如 如果操作函数 source.First(user -> user.isOnline()) 不存在,则我们依然可以使用 source.转载 2016-07-08 23:02:28 · 3675 阅读 · 0 评论 -
RxJava 驯服数据流之 hot & cold Observable
Observable 数据流有两种类型:hot 和 cold。这两种类型有很大的不同。本节介绍他们的区别,以及作为 Rx 开发者应该如何正确的使用他们。Cold observables只有当有订阅者订阅的时候, Cold Observable 才开始执行发射数据流的代码。并且每个订阅者订阅的时候都独立的执行一遍数据流代码。 Observable.interval 就是一个 Cold Observab转载 2016-07-06 15:10:29 · 7089 阅读 · 0 评论 -
RxJava 驯服数据流之时间平移
Rx 最大的特征之一就是无法预测何时会有数据发射。有些 Observable 会同步的即可发射所有的数据,比如 range ,有些按照一定的时间间隔发射数据、有些根本无法确定到底何时发射数据。例如,鼠标移动时事件和 UDP 数据包到达的时刻。我们需要合适的工具来处理这些无法确定何时发射的事件。Buffer 缓存Buffer 可以收集数据并缓存起来,等缓存到固定的数目后一起发射,而不是来一个发射一个。转载 2016-07-06 14:00:41 · 3858 阅读 · 0 评论 -
RxJava 驯服数据流之组合数据流
组合数据流到目前为止我们介绍了如何创建数据流以及如何把数据流中的数据转换成我们需要的数据。然而,大部分应用都需要处理多个数据源的数据。需要一种把多个数据源组合一起的方法。在前面的介绍中,也看到了一些数据流会使用多个 Observable。本节介绍如何把多个数据源的数据组合为一个数据源的操作函数。Concatenation一个数据流发射完后继续发射下一个数据流是一种很常见的组合方法。concatcon转载 2016-07-06 11:39:15 · 3334 阅读 · 0 评论 -
RxJava 驯服数据流之高级错误处理
在实际项目代码中可能出现各种各样的异常情况,并不是每一个异常都需要告诉上层代码的。在传统的 Java 中,你可以捕获一个异常,然后决定是自己处理该异常还是再次抛出去。同样,在 RxJava 中,你也可以根据异常来执行不同的逻辑而无需结束 Observable,也不再强迫 Observer 处理所有情况。ResumeonErrorReturnonErrorReturn 操作函数的功能是:当发生错误的时转载 2016-07-06 10:00:11 · 8008 阅读 · 0 评论 -
RxJava 驯服数据流之避免monad
monad 是函数式编程中的抽象概念,是一种高度的数学抽象,关于 monad 的详细介绍请看这里: Functors, Applicatives, And Monads In Pictures ,不要百度搜索其他的资料, 关于 monad 的介绍,在网上有 90% 都是错误的,误导人的。在 www.introtorx.com 中也有一个简短的定义: Monad 是一种在模型域对象中封装了计算逻辑而转载 2016-07-05 23:11:58 · 2264 阅读 · 0 评论 -
RxJava 驯服数据流之副作用
前面两部分,我们学习到了如何创建 Observable以及如何从 Observable 中获取数据。本部分将介绍一些更高级的用法,以及一些在大型项目中的最佳实践。Side effects(副作用)没有副作用的函数通过参数和返回值来程序中的其他函数相互调用。当一个函数中的操作会影响其他函数中的返回结果时,我们称该函数有副作用。写数据到磁盘、记录日志、打印调试信息都是常见的副作用表现。Java 中在一个转载 2016-07-05 22:45:29 · 2827 阅读 · 0 评论 -
RxJava 事件流之转换数据流
Transformation of sequences本节介绍转换数据流中数据的方法。在真实世界中, Observable 中的数据可以是任意类型的,可能在你的应用中无法直接使用这些数据类型,你需要对这些数据对象进行一些转换。 map 和 flatMap 是本节中操作函数的基础。 下面是三种转换方式的示意:Ana(morphism) T –> ObservableCata(morphism)转载 2016-07-05 21:57:48 · 4101 阅读 · 0 评论 -
RxJava 事件流之聚合
Aggregation前面介绍了如何过滤掉不需要的数据、如何根据各种条件停止发射数据、如何检查数据是否符合某个条件。这些操作对数据流来说都是非常有意义的。 本节介绍如何根据数据流中的数据来生成新的有意义的数据。本节的操作函数会使用源 Observable 中的事件流中的数据,然后把这些数据转换为其他类型的数据。返回结果是包含一个数据的 Observable。如果你从头开始阅读本系列教程,则会发现前面转载 2016-07-05 18:35:48 · 4895 阅读 · 0 评论 -
RxJava 事件流之检查数据
Inspection 检查数据是否符合某一条件前面一节介绍了如何过滤掉我们不关心的数据。有时候我们需要了解该数据流中的数据是否符合某一条件。本节来介绍一些检查数据流中数据的函数。allall 函数用来判断 observable 中发射的所有数据是否都满足一个条件。public final Observable<java.lang.Boolean> all(Func1<? super T,java.l转载 2016-07-05 17:54:53 · 3350 阅读 · 0 评论 -
RxJava 事件流之过滤数据
现在你可以用 Rx 来处理大批量实时数据,但是如果把所有大批量数据整个打包发给你的话,使用 Rx 还有啥优势呢? 本节 我们将介绍一些操作函数(operators )来过滤数据、或者把所有数据变成一个需要的数据。如果你了解过函数式编程(functional programming)或者 Java 中的 Stream,则本节介绍的操作函数是非常眼熟的。本节中所有的操作符都返回一个不影响前一个 Obse转载 2016-07-05 16:50:35 · 14401 阅读 · 0 评论 -
RxJava 创建事件流
了解了 Rx 的概念,就要了解怎么创建和操作事件流了。操作事件流的原始实现是基于 C# 的 LINQ,而 LINQ 是受到 functional programming 启发的。如果你了解 LINQ 更容易理解本节内容, 如果不了解也没关系。我们将从最简单的内容开始介绍。 大部分的 Rx 操作函数(operators )用来操作已经存在的事件流。在介绍操作函数之前,先来看看如何创建一个 Observ转载 2016-07-05 16:05:21 · 5535 阅读 · 0 评论 -
深入浅出RxJava——在Android中使用响应式编程
原文链接在第1,2,3篇中,我大概介绍了RxJava是怎么使用的。下面我会介绍如何在Android中使用RxJava.RxAndroidRxAndroid是RxJava的一个针对Android平台的扩展。它包含了一些能够简化Android开发的工具。首先,AndroidSchedulers提供了针对Android的线程系统的调度器。需要在UI线程中运行某些代码?很简转载 2016-05-11 15:19:23 · 1607 阅读 · 0 评论 -
深入浅出RxJava——响应式的好处
原文链接在第一篇中,我介绍了RxJava的基础知识。第二篇中,我向你展示了操作符的强大。但是你可能仍然没被说服。这篇里面,我讲向你展示RxJava的其他的一些好处,相信这篇足够让你去使用Rxjava.错误处理到目前为止,我们都没怎么介绍onComplete()和onError()函数。这两个函数用来通知订阅者,被观察的对象将停止发送数据以及为什么停止(成功的完成或者出错了)。下面的转载 2016-05-11 15:17:38 · 2256 阅读 · 0 评论 -
深入浅出RxJava——基础篇
原文链接RxJava正在Android开发者中变的越来越流行。唯一的问题就是上手不容易,尤其是大部分人之前都是使用命令式编程语言。但是一旦你弄明白了,你就会发现RxJava真是太棒了。这里仅仅是帮助你了解RxJava,整个系列共有四篇文章,希望你看完这四篇文章之后能够了解RxJava背后的思想,并且喜欢上RxJava。基础RxJava最核心的两个东西是Observa转载 2016-05-11 15:01:23 · 2349 阅读 · 2 评论 -
RxJava入门之生命周期管理
Rx 背后的理念是:无法知道事件流何时发射数据、也不知何时结束发射,但是你需要控制何时开始和结束接受事件。订阅者可能使用了一些资源,这些资源需要在停止接收事件的时候释放。 通过 subscription 可以实现生命周期管理。SubscribingObservable.subscribe 有好几个重载函数,每个函数都是某种情况的简化形式。Subscription subscribe()Sub转载 2016-07-05 11:31:44 · 4188 阅读 · 0 评论 -
RxJava 入门之关键的类
Rx 有两个最基础的类型,和其他一些扩展这两种类型的类。两个核心的类为: Observable 和 Observer。Subject 是同时继承了 Observable 和 Observer。Rx 是在 Observer 模式之上建立起来的。这种模式很常见,在 Java 中有很多地方都使用了该模式,比如 JavaFx 中的 EventHandler。 这些简单的使用方式和 Rx 对比有如下区别:使转载 2016-07-04 23:45:18 · 4257 阅读 · 3 评论