( Observable.intervalRange(0, 3, 1, 1, TimeUnit.SECONDS), // 从0开始发送、共发送3个数据、第1次事件延迟发送时间...= 1s、间隔时间 = 1s Observable.intervalRange(2, 3, 1, 1, TimeUnit.SECONDS)) // 从2开始发送、共发送...将先发送了数据的Observables 的最新(最后)一个数据 与 另外一个Observable发送的每个数据结合,最终基于该函数的结果发送数据 与Zip()的区别:Zip() = 按个数合并,即1对...), // 第2个发送数据事件的Observable:从0开始发送、共发送3个数据、第1次事件延迟发送时间 = 1s、间隔时间 = 1s new BiFunction...count() 作用 统计被观察者发送事件的数量 具体使用 // 注:返回结果 = Long类型 Observable.just(1, 2, 3, 4)
, 1, TimeUnit.SECONDS), // 从0开始发送、共发送3个数据、第1次事件延迟发送时间 = 1s、间隔时间 = 1s Observable.intervalRange...Observables 的最新(最后)一个数据 与 另外一个Observable发送的每个数据结合,最终基于该函数的结果发送数据 与Zip()的区别:Zip() = 按个数合并,即1对1合并;CombineLatest..., // 第2个发送数据事件的Observable:从0开始发送、共发送3个数据、第1次事件延迟发送时间 = 1s、间隔时间 = 1s new BiFunction...3.4 统计发送事件数量 count() 作用 统计被观察者发送事件的数量 具体使用 // 注:返回结果 = Long类型 Observable.just(1, 2, 3, 4)...4.2 合并数据源 & 同时展示 即,数据源 来自不同地方(如网络 + 本地),需要从不同的地方获取数据 & 同时展示 具体请看文章:Android RxJava 实际应用讲解:合并数据源 4.3 联合判断
作用 通过设置函数,判断被观察者(Observable)发送的事件是否符合条件 ---- 2. 类型 RxJava2中,条件 / 布尔操作符的类型包括: ? 下面,我将对每个操作符进行详细讲解 3....设置的函数条件 若满足,返回 true;否则,返回 false 具体代码 Observable.just(1,2,3,4,5,6) .all(new Predicate...3.2 takeWhile() 作用 判断发送的每项数据是否满足 设置函数条件 若发送的数据满足该条件,则发送该项数据;否则不发送 具体代码 // 1....3.3 skipWhile() 作用 判断发送的每项数据是否满足 设置函数条件 直到该判断条件 = false时,才开始发送Observable的数据 具体使用 // 1....3.7 contains() 作用 判断发送的数据中是否包含指定数据 若包含,返回 true;否则,返回 false 内部实现 = exists() 具体代码 Observable.just(
作用 通过设置函数,判断被观察者(Observable)发送的事件是否符合条件 2. 类型 RxJava2中,条件 / 布尔操作符的类型包括: 下面,我将对每个操作符进行详细讲解 3....设置的函数条件 若满足,返回 true;否则,返回 false 具体代码 Observable.just(1,2,3,4,5,6) .all(new Predicate...设置函数条件 直到该判断条件 = false时,才开始发送Observable的数据 具体使用 // 1....,即 等到 takeUntil() 传入的Observable开始发送数据,(原始)第1个Observable的数据停止发送数据 // (原始)第1个Observable:每隔1s发送1个数据 = 从0...的数据才开始发送数据 具体使用 // (原始)第1个Observable:每隔1s发送1个数据 = 从0开始,每次递增1 Observable.interval
操作符的使用 在了解基本知识和线程调度后,我们来学习一下RxJava各种神奇的操作符 Map Map是RxJava中最简单的一个变换操作符了, 它的作用就是对Observable发送的每一个事件应用一个函数...,他们都是把一个对象转换为另一个对象,但须注意以下这些特点: 1.flatMap 返回的是一个Observable对象,而 map 返回的是一个普通转换后的对象; 2.flatMap 返回的Observable...对象并不是直接发送到Subscriber的回调中,而是重新创建一个Observable对象,并激活这个Observable对象,使之开始发送事件;而 map 变换后返回的对象直接发到Subscriber...回调中; 3.flatMap 变换后产生的每一个Observable对象发送的事件,最后都汇入同一个Observable,进而发送给Subscriber回调; 4.map返回类型 与 flatMap...ZIP Zip通过一个函数将多个Observable发送的事件结合到一起,然后发送这些组合到一起的事件. 它按照严格的顺序应用这个函数。
4、elementAt(获取指定位置元素) 可作用于Flowable,Observable,从数据源获取指定位置的元素,从0开始。...将数据源的元素作用于指定函数后,将函数的返回值有序的存在新的数据源。...5、concatMapCompletable 作用于Flowable、Observable。与contactMap类似,不过应用于函数后,返回的是CompletableSource。...但调用数据源的onError函数后会回到该函数,可对错误进行处理,然后返回值,会调用观察者onNext()继续执行,执行完调用onComplete()函数结束所有事件的发射。...()函数的返回值。
elementAt(获取指定位置元素) 可作用于Flowable,Observable,从数据源获取指定位置的元素,从0开始。...将数据源的元素作用于指定函数后,将函数的返回值有序的存在新的数据源。...concatMapCompletable 作用于Flowable、Observable。与contactMap类似,不过应用于函数后,返回的是CompletableSource。...但调用数据源的onError函数后会回到该函数,可对错误进行处理,然后返回值,会调用观察者onNext()继续执行,执行完调用onComplete()函数结束所有事件的发射。...retryWhen与此类似,但其判断标准不是BooleanSupplier对象的getAsBoolean()函数的返回值。而是返回的 Observable或Flowable是否会发射异常事件。
/Observable cast 强转 传入一个class,对Observable的类型进行强转. flatMap 平铺映射,从数据流的每个数据元素中映射出多个数据,并将这些数据依次发射。...(注意是无序的) concatMap concatMap 与 flatMap 的功能非常类似,只不过发送的数据是有序的 buffer 缓存/打包 按照一定规则从Observable收集一些数据到一个集合...使用Map变换操作符中的Function函数对被观察者发送的事件进行统一变换:整型变换成字符串类型 }).map(new Function() { @Override...接着我们来看下 onNext 方法 判断是否 done,如果已经 done ,直接返回 调用 mapper.apply(t) ,进行相应的转化 调用下游的 onNext 方法,并将 V 暴露出去 这样就完成了操作符的操作功能...通过先调用 mapper.apply 转换回调函数获得转换后的数据,然后下发给下游 Obsever。
上篇文章《RxJava从入门到不离不弃(一)——基本概念和使用》,介绍了RxJava的概念和优点,也详细介绍了Observer、Observable和Subscriber等常见概念,相信大家对RxJava...上篇文章中的示例大家可能会觉得,打印字符串需要那么麻烦嘛?主要是为了展示RxJava的原理而采用了这种比较啰嗦的写法,RxJava其实提供了很多便捷的函数来帮助我们减少代码。...RxJava内置了很多简化创建Observable对象的函数,比如Observable.just就是用来创建只发出一个事件就结束的Observable对象,创建Observable对象可以这样写: just...,第一个参数为起始值,第二个为发送的个数,如果为0则不发送,负数则抛异常。...error)也是单参数无返回值的,因此 Action1 可以将 onNext(obj) 和 onError(error) 打包起来传入 subscribe() 以实现不完整定义的回调。
RxJava就是一种响应式编程框架,利用观察者、装饰模式来实现上下流消息通信和函数式编程,解决了上下流解耦、回调地狱等,其中的思想很值得我们学习,今天来模拟实现RxJava的架构 一、观察者与被观察者...,并在该观察者方法中使用数据转换函数后,调用外部传入的观察者的方法 /** * 转换后新的被观察者,就是将原来的被观察者装饰了下 */ class DecorateObservable) { //实例化一个发送from数据的观察者 observable.subscribe(object : Observer {...override fun onNext(obj: from) { // 数据转换后,通过发送to数据的观察者发送 observer.onNext...//实例化一个发送from数据的观察者 observable.subscribe(object : Observer { override fun onNext
从RxJava2-Android-Samples的ReadMe.md中可以看到有如下操作符 操作符 操作符 操作符 操作符 Map Zip Reduce Filter FlatMap Take Skip...函数定义的数据转换,再将转换后的事件发射给Observer。...如上例所示,每隔250毫秒就会发送一个从0开始的事件,发送0,1,2,3...一直累加的事件 zip只会以最少的发射器数量为标准合并事件。...Reduce 如下示例: 每250毫秒发送一个事件 在reduce接收的函数中,每次将发送的事件结果与之前的事件结果相加,并且返回 在subscribe中订阅最终的事件 Observable.interval...,只有返回true的事件才能继续往Observer传递 ?
Observable,它发射一个类似于函数声明的值。...它可以返回任何它想返回的Observable对象。...) Zip 通过一个函数将多个Observables的发射物结合到一起,基于这个函数的结果为每个结合体发射单个数据项。...,使用一个函数结合每个Observable发射的最近数据项,并且基于这个函数的结果发射数据。...retryWhen和retry类似,区别是,retryWhen将onError中的Throwable传递给一个函数,这个函数产生另一个Observable,retryWhen观察它的结果再决定是不是要重新订阅原始的
3.4.1 filter 过滤操作符filter(),通过一定逻辑来过滤被观察者发送的事件,如果返回 true 则会发送事件,否则不会发送。...image.png 3.4.6 elementAt 或 elementAtOrError() 过滤操作符 elementAt(),可以指定取出事件序列中事件,下标从0开始,但如果指定的index大于总的事件序列数...其余的我就不写代码了,大家也都能明白. doAfterNext Observable 每发送 onNext() 之后都会回调这个方法。...doOnNext Observable 每发送 onNext() 之前都会先回调这个方法。...image.png repeatWhen 这个方法可以会返回一个新的被观察者设定一定逻辑来决定是否重复发送事件,具体就不说了都一样的。
如果不懂RxJava,对于Hystrix和Ribbon的学习就会令人头疼不已。 从基础原理讲起:观察者模式 本文的重要特色,从基础原理讲起。...当订阅开始时,Observable主题便开始发送事件。...1.Action0回调接口 这是一个无参数、无返回值的函数式接口,源码如下: package rx.functions;/** *A zero-argument action....2.Action1回调接口 这是一个有一个参数、泛型、无返回值的函数式接口,源码如下: package rx.functions;/** *A one-argument action....(2)过滤型操作符:从Observable弹射的消息流中过滤出满足条件的消息。 (3)转换型操作符:对Observable弹射的消息执行转换操作。
.): 将传入的参数依次发送出来 Observable observable = Observable.just("111", "222", "333"); // 相当于依次调用 // onNext("...但需要注意,和 map() 不同的是, flatMap() 中返回的是个 Observable 对象,并且这个 Observable 对象并不是被直接发送到了 Subscriber 的回调方法中。...flatMap() 的原理是这样的:1. 使用传入的事件对象创建一个 Observable 对象;2. 并不发送这个 Observable, 而是将它激活,于是它开始发送事件;3....concatMap() scan 对一个序列的数据应用一个函数,并将这个函数的结果发射出去作为下个数据应用函数时的第一个参数使用,看一个例子: Observable.just(1, 2, 3, 4, 5...只发送观测序列中的第一个数据项 Last Observable只发射观测序列中的最后一个数据项
,变换的详情可以从链式调用的顺序得知,因此整体代码显得特别的简洁易读和容易拓展,使用这套框架开发能够有效节省阅读代码带来的精力和时间成本。...在代码中,map方法通过传入一个实现Func1接口的对象,能把原事件序列上的事件一对一映射成新类型的事件,Func1接口是一个函数式接口,只有一个回调方法call,回调方法有一个参数和一个返回值(除此之外还有...,这个Observable要发送的数据就是原数据一对多映射返回的所有数据,对每个原序列上的数据映射后返回的每个Observable,在新序列上会把这些Observable要发送的数据铺平发送,如上图所示...,在映射方法的最后返回一个把转换得到的ArrayList作为发送事件的列表的Observable,这样就实现了一对多的变换,一个String对象对应char类型ArrayList里的所有数据。...这些映射返回的新Observable会在新序列里发射数据,在代码中就是把原序列的所有String对象里的所有char数据在新序列发送出去,订阅的subscriber响应这些char类型数据并将其打印,当所有数据都发送完毕
RxFile是一款从安卓设备获取图片或者视频的工具类,让你的需要读取相册返回图片功能更流畅,并防止ANR现象。RxFile是国外的名叫Tournaris 写的,本文开始介绍怎么使用RxFIle。...日志 RxFile.setLoggingEnabled(true); 2 从ClipData获取多个文件 RxFile.createFilesFromClipData(this,clipData)...,你可以通过这些方法来从不同渠道获取不同的文件格式,让你面对相册,视频选择的需求时候是不再头痛。...Observable getFileExtension(final String fileName); Observable ifExists(final String...path); Observable getThumbnail(String filePath); Observable getVideoThumbnail(final
被返回的Observable所要发送的事件决定了重订阅是否会发生。如果发送的是onCompleted或者onError事件,将不会触发重订阅。...相对的,如果它发送onNext事件,则触发重订阅(不管onNext实际上是什么事件)。...你必须对Observable做出反应,然后基于它发送事件;你不能只返回一个通用泛型流。...它不会从源中接收到任何onNext的通知,所以你不能通过观察被发送的事件来决定重订阅。如果你真的需要这样做,你应该添加像.takeUntil()这样的操作符,来拦截事件流。...因为在发送onNext()之前delay了一段时间,所以优雅的实现了延迟重订阅,从而避免了不间断的数据轮询。
,是响应式函数的扩展库,在观察者模式上实现了发送者(observable)和接受者(observer)解耦;链式调用降低业务之间的依赖,使得代码很简介;支持泛型,减少冗余代码,增强代码可读性;支持设置同步异步切换...subscribe() ,被观察者的方法,通过该方法在订阅成功后给观察者发送事件。 onNext(),观察者的方法,接受被观察者事件处理结果的方法。...zip() zip会将多个被观察者合并,根据各个被观察者发送事件的顺序一个个结合起来,最终发送的事件数量会与源 Observable 中最少事件的数量一样。...image.png 上面代码中有两个 Observable,第一个发送事件的数量为3个,第二个发送事件的数量为4个,可以发现最终接收到的事件数量是3,那么为什么第二个 Observable 没有发送第4...count() count,返回被观察者发送事件的数量。
1个事件都通过 指定的函数 处理,从而变换成另外一种事件 即, 将被观察者发送的事件转换为任意的类型事件。...使用Map变换操作符中的Function函数对被观察者发送的事件进行统一变换:整型变换成字符串类型 }).map(new Function() {...String类型 对象后返回 同时,事件的参数类型也由 Integer 类型变成了 String 类型 3.2 FlatMap() 作用:将被观察者发送的事件序列进行 拆分 & 单独转换,再合并成一个新的事件序列...都合并到一个 新建的、总的Observable 对象; 新建的、总的Observable 对象 将 新合并的事件序列 发送给观察者(Observer) 应用场景 无序的将被观察者发送的整个事件序列进行变换...,即 严格按照旧序列发送事件的顺序 3.4 Buffer() 作用 定期从 被观察者(Obervable)需要发送的事件中 获取一定数量的事件 & 放到缓存区中,最终发送 原理 应用场景