RxJava 1.x 笔记:创建型操作符
来源:互联网 发布:在淘宝搜什么有福利 编辑:程序博客网 时间:2024/06/04 19:15
本篇文章是阅读 官方文档 的笔记。
作者:shixinzhang(百度搜索 “shixinzhang CSDN” 即可找到我)
RxJava 也用了有段时间,那么多操作符总不想去记,遇到了才去查一下,查的次数多了感觉效率太低,还不如先过一遍官方文档。
因此接下来几篇我们一起刷一遍 RxJava 官方文档,这个过程可能会很枯燥,但是像电影里少林寺练功 一样,只有先通过枯燥的学习掌握基本功,然后才能考虑如何应用,加油!
读完本文你将了解:
- 创建型操作符
- create
- defer
- Empty
- Never
- Throw
- From
- Interval
- Just
- Range
- Repeat
- RepeatWhen
- Start
- Timer
- Thanks
创建型操作符
创建型操作符即用于创建 Observable 的操作符。
create
RxJava 中,create()
通过一个传递一个 Observable.OnSubscribe
创建一个Observable
,Observable.OnSubscribe
的泛型参数指明要创建的数据类型:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
在 create()
中根据创建任务的状态分别调用 onNext()
, onCompleted()
和 onError()
。
在 create()
中最好调用 isUnsubscribed()
检查观察者的订阅状态,这样在没有观察者时可以避免做无用的创建工作。
create()
默认不在任何特定的调度器上执行。
defer
defer
中文意思 “推迟、延迟”。
defer
操作符,只有观察者订阅后才会使用一个 Observable
工厂方法创建 Observable
,每次有新的观察者订阅时,都会重复这个操作。
订阅者以为订阅的是同一个数据源,其实是各自订阅的是不同的 Observable
。
RxJava 中对应的实现是 defer()
,接受一个 Func0<Observable<T>>
类型的参数:
- 1
- 2
- 3
- 1
- 2
- 3
我们可以传入一个 Func0<Observable<T>>
的匿名内部类,泛型参数是数据类型:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
Empty
Empty
用于创建一个不发射任何数据,但是会发射终止消息的 Observable
。
RxJava 中对应的实现是 empty()
方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
使用起来也很简单,没有参数:
- 1
- 2
- 1
- 2
Never
Never
用于创建一个不发射任何数据,也不会发射终止消息的 Observable
(意义何在?)。
RxJava 中对应的实现是 never()
方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
可以看到这个方法返回的 NeverObservable
不会发出任何消息,使用起来和 empty()
类似:
- 1
- 2
- 1
- 2
Throw
Throw
用于创建一个不发射任何数据,但是会发射错误消息的 Observable
。
RxJava 中对应的实现是 error()
方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
可以看到,error()
会发射一个 onError()
事件。
使用很简单,只需传入一个 Throwable
:
- 1
- 2
- 1
- 2
Empty/Never/Throw
三个操作符创建的 Observable 比较特殊,一般用于测试,有时也结合其它的数据源,作为其它操作符的参数。
From
From
可以将其他对象或者数据类型转换成 Observables
。
当使用 Observable 时,最好是所有数据源都是 Observable 类型,那样配合操作符将十分方便。这时如果有 Observable 以外的其他数据类型,我们最好使用一些操作符将其他类型转换为 Observable 。
比如 Iterable
迭代器,可以转换成一系列同步的 Observable;Future
,可以转做每次只发射一个元素的 Observable。通过显式地将其他类型转换成 Observable,就可以方便地体会 Rx 的便捷之处。
大部分 ReactiveX 的实现语言都提供了将特定的对象和数据结构转换为 Observables 的方法。
RxJava 中对应的实现是 from()
:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
from()
支持参数为数组、Iterable、Future,也就是说,这个操作符可以将数组、Iterable 和 Future 类型的数据转换为 Observable。
对于 Iterable 和数组,转换后的 Observable 会发射 Iterable 或数组中的每一项数据。
不了解 Iterable 的同学可以看这篇:Java 集合源码解析:Iterator。
使用例子:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
运行结果:
from()
默认不在任何特定的调度器上执行。我们可以将 Scheduler
作为第二个参数传递给Observable,这个 Future 将会在指定的线程执行。
Interval
Interval
用于创建一个按指定时间间隔、发送递增的整数序列的 Observable。
Interval
操作符返回的 Observable 会间隔发射一个无限递增的整数序列。
RxJava 中对应的实现为 interval()
,它接受一个表示时间间隔的参数和一个表示时间单位的参数:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
使用例子:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
在这个例子中我们使用 interval()
创建了一个 Observable,它将发射递增的整数序列。在 onNext()
中我们当 t > 10 时取消订阅。运行结果:
Just
Just
用于创建一个发射特定元素的 Observable。
Just
操作符用于将一个元素转换成 Observable,然后将它发射出去。
Just
和 From
有些相似,不同之处在于 From
会将数组或 Iterable
的数据取出后逐个发射;而 Just
只是简单的原样发射,将数组或 Iterable 当做单个数据一次性发射出去。
RxJava 中对应的实现是 just()
:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
可以看到,多个参数的 just()
最后其实还是调用的 from()
。
使用例子:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
我们传递给 just()
一个数组,结果输出的还是数组对象;传递给一个 null,输出的也是 null:
可以看到,just()
果然和名字一样,就是将转换的数据直接发出去。
注意,如果你传递 null 给 just,它会返回一个 Observable 然后发射出去一个 null,而不会创建一个空的 Observable。如果想创建一个空的,你需要使用
Empty
操作符。
Range
Range
用于创建一个发射指定范围的整数序列的 Observable。
RxJava 中对应的实现为 range()
:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
可以看到,just()
接受两个参数,第一个是起始值,第二个是个数。如果你将第二个值设置为 0,就不会发射数据;如果设置为负数或者起始值太大,就会抛出异常。
使用例子:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
运行结果:
Repeat
Repeat
用于创建一个多次发射特定数据的 Observable。
RxJava 中的实现 repeat()
不是静态的,也就是说它不可以用于创建 Observable,只可以对已有的 Observable 进行重复发射,参数指定重复次数。
- 1
- 2
- 3
- 1
- 2
- 3
使用时需要先创建一个 Observable,然后对他进行 repeat 操作:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
运行结果:
可以看到,当 repeat()
接收到 onCompleted()
事件后触发重订阅。
repeat
操作符默认在trampoline
调度器上执行。我们可以自行指定 Scheduler。
RepeatWhen
RepeatWhen 相对费解一些。
Repeat
接收到 onCompleted()
事件后就会触发重订阅,而 RepeatWhen
则在它的基础上,增加了什么时候重订阅的控制。
RepeatWhen
在接受到 onCompleted 事件后,会进行条件检查,然后进行相应的重发操作;在接收到 onError 事件后,会停止重复。
RxJava 中对应的实现是 repeatWhen()
:
- 1
- 2
- 3
- 1
- 2
- 3
可以看到, repeatWhen()
的第一个参数是输入的 Observable 的处理函数,第二个参数是处理策略。
由于只有在调用 onCompleted 时才会调用参数,所以它是 Void 类型。
使用例子:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
每次发射 onCompleted 事件时会进入 repeatWhen
的匿名内部类参数,在其中我们做了延迟处理。
运行结果:
可以看到,每过 5 秒重复一次。
Start
Start
的作用是创建一个发射函数返回值的 Observable。
编程语言中有很多种获取计算结果的方法,比如 functions
, futures
, actions
, callables
, runnables
等等。Start
操作符可以将他们的结果转为 Observable,从而更方便地进行操作。
RxJava 中 Start
的实现有很多种,它们都属于 rxjava-async
模块。
在 RxJava 中
From
操作符可以将Future
转换为 Observable,与start
相似。
Timer
Timer
用于创建一个在指定延迟后发射值的 Observable。
RxJava 中对应的实现是 timer
:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
timer()
返回一个Observable,它会在延迟给定的时间后发射一个数字 0。
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
运行结果:
我们走完了约五分之一的流程,坚持就是胜利!!!
Thanks
http://reactivex.io/documentation/operators.html
http://www.jianshu.com/p/023a5f60e6d0
- RxJava 1.x 笔记:创建型操作符
- RxJava 1.x 笔记:过滤型操作符
- RxJava 1.x 笔记:组合型操作符
- RxJava 1.x 笔记:变换型操作符
- [RxJava笔记]RxJava操作符
- RXJava 创建操作符
- RXjava 创建操作符
- RxJava操作符 -创建型
- RxJava学习之创建型操作符
- RxJava 学习笔记(五) --- Creating 创建操作符
- RxJava 创建操作符create
- RxJava 创建操作符form
- RxJava 创建操作符 just
- RxJava 创建操作符 defer
- RxJava-创建Observable操作符
- RxJava操作符(1)-创建
- RxJava创建类型操作符
- RxJava—创建操作符
- DateTimePicker中自定义时间或日期显示格式
- caffe (5) 命令行解析
- sort函数的用法(C++排序库函数的调用)
- kafka+storm+Hbase流式数据处理
- hadoop连接mysql数据库执行数据读写数据库操作
- RxJava 1.x 笔记:创建型操作符
- 第五讲 单片机C语言之AD转换
- A
- Express---node.js-express框架中的主要方法,使用中间件关联 多个路由
- MySQL快速删除大表
- php生成GUID
- hihocoder 1038 : 01背包
- KNN
- UVA297QuadTrees