转载请标明出处:
http://blog.csdn.net/tyzlmjj/article/details/50696828
本文出自:【M家杰的博客】
概述
最近才刚开始去看RxJava相关的内容,看着看着就陷阱去了,总感觉自己落伍了,不谈别的,光看RxJava写出的代码就很必哟特佛
。当然了,任何开源库的普及都需要建立在强大的功能上,恩,就是这样……
这边我整理了下自己看过感觉比较好的适合新手的中文博客。然后简单的把部分控制符的功能用中文描述了下。英文比较差,老是回头看英文文档好累。
注意:英语好的同学请往这边走RxJava WIKI
基础学习
- 深入浅出RxJava 一:基础篇
- 深入浅出RxJava 二:操作符
- 深入浅出RxJava 三–响应式的好处
- 深入浅出RxJava 四-在Android中使用响应式编程
这篇文章的话有部分内容过时了,不过还是很值得看看的 - 给 Android 开发者的 RxJava 详解
这篇文章内容很多,但是个人感觉讲解的条理不清晰,刚接触RxJava推荐看前面几篇。
注意:在安卓中使用RxJava最好把RxAndroid也同时引入
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'
RxAndroid是RxJava在安卓上的扩展,目前就只有几个类。
控制符
RxJava的控制符茫茫多啊!这边简单的写了一些描述,还有很多,有闲暇的时间再更新吧……
创建Observable
Observable(被观察者)一般情况下就是RxJava代码的起点,先来一份创建它的控制符
英文地址
- 静态方法
方法名 | 描述 |
---|---|
just( ) | 最基本的创建方式,可以传入多个同类型的参数 |
from( ) | 可以传入数组、集合、或线程返回值,它会将数组分解,省去手动遍历的步骤 |
create( ) | 手动创建的方法,订阅者的onNext()、onCompleted()方法都需要在这里自己调用 |
defer( ) | 延迟Observable的创建,直到被订阅。可以理解为提高一点性能,具体看官方推荐博客 |
range( ) | 创建一个可发出一系列连续的整数的Observable,三个参数的方法可以指定线程 |
interval( ) | 返回从0开始的长整型序列,可以传入开始的延迟时间、时间间隔、线程调度。试了下,好像不会停要自己手动停止 |
timer( ) | 设置1个间隔时间,只会返回一次,返回值:0 |
empty( ) | 会直接调用订阅者的onCompleted()方法。 |
error( ) | 需要传入异常,会直接调用订阅者的onError()。 |
never( ) | 执行之后什么反应都没有! |
- 公有方法
需要创建实例之后调用。也就是用了上面的之后才能用这两个
方法名 | 描述 |
---|---|
repeat( ) | 复制Observable并重复,可以传入重复次数,不传参数的方法会无限重复下去 |
repeatWhen( ) | 也是进行复制然后重复,但是他可以进行过滤操作,用起来其实不方便 |
转换Observable
方法名 | 描述 |
---|---|
map( ) | 可以改变每一项的值甚至类型 |
flatMap( ) concatMap( ) andflatMapIterable( ) | 可以理解为map的增强版,返回类型是Observable< R >,可以将一项分解为多项(比如处理集合)。并且可以给onCompleted()和onError()加返回值,返回在onNext()中。 |
switchMap( ) | 和上面类似,但这个方法比较单一 |
scan( ) | 可以获取前一项和当前项进行处理。比如一个数列[0,1,2,3],可以处理当前项加上前面一项变成[0,1,3,6],还可以传入第0个数 |
groupBy( ) | 将数据进行分组,在他的方法中返回键,最终返回的是GroupedObservable< K , T > |
buffer( ) | 使用缓冲区进行类似分组操作,最终返回的是list集合 |
window( ) | 将数据分组成多个Observable,并且可以做很多操作:按时间间隔分段、跳过等等 |
cast( ) | 没官方文档。进行类型转换,比如本来最终返回是ArrayList类型,.cast(List.class) 之后就会强转成List。这个不实用,Float转Integer都不行 |
过滤
方法名 | 描述 |
---|---|
filter( ) | 过滤不想要的元素,在方法中返回false即过滤掉这个元素 |
last( ) | 取最后一项,过滤掉前面的。有参数的方法可以把最后一项也过滤掉! |
lastOrDefault( ) | 也是取最后一项,当没有数据或者判断最后一项不满足条件时返回设置的默认值。 |
takeLast( ) | 取最后N项,过滤掉前面的。还可以设置取最后一段时间内的数据。默认运行在子线程 |
takeLastBuffer( ) | 与takeLast基本一样,不过返回的数据变成了集合 |
skip( ) | 跳过前面N项。或者还可以跳过多少时间。这个时间很独特,假设数据全部返回到订阅者需要10秒,你设置了跳过5秒,那么它只会返回后5秒的数据 |
skipLast( ) | 跟上面反一下,从最后开始跳过 |
take( ) | 只取N项,或者只取一个时间段内的数据 |
first( ) takeFirst( ) | 取第一项,过滤掉后面的。也可以做判断,把第一项也过滤了 |
firstOrDefault( ) | 取第一项,当没有数据或者判断第一项不满足条件时返回设置的默认值。 |
elementAt( ) | 取第N项,就像是取集合的第N项一样 |
elementAtOrDefault( ) | 取第N项,还可以设置默认值以防止越界 |
sample( ) throttleLast( ) | 还是设置时间的,设置一个时间间隔,取这个时间间隔内最后一个数据。也可以放入一个Observable来取多个时间间隔的数据 |
throttleFirst( ) | 跟上面一样,只是这个是取时间间隔内的第一个数据 |
throttleWithTimeout( ) debounce( ) | 设定一个时间间隔,这个时间间隔从每一项的返回开始,假如在这个时间间隔内没有其他的返回项,则返回这一项。也就是一个时间间隔内,只能有一个返回项 |
timeout( ) | 设定时间间隔,从每一项返回开始计算这个间隔,如果这个间隔内没有任何项返回,那么做超时处理,就是调用onError(),也可以为这种情况设置默认的返回 |
distinct( ) | 过滤掉重复项。也可以自己进行比较然后给出一个Key,方法会过滤掉重复的Key |
distinctUntilChanged( ) | 过滤掉连续的重复项。比如返回1、1、1、2、2、2、1、2 ,那么过滤后是1、2、1、2 。当然,这个也可以自己判断然后给出Key。 |
ofType( ) | 通过类过滤,比如这样ofType(Integer.class ) ,那么其它类型都会被过滤,只返回int |
ignoreElements( ) | 把返回的数据源全部过滤了。如果运行正常会调用onCompleted() ,有异常就调用onError 。就是一个不管过程只看结果是否正确的 |