上期简单讲了Rxjava的入门,方便大家认识Rxjava,这期带大家了解Rxjava,认识Rxjava的更多特性
Rxjava操作符
Rxjava操作符就是各种方法,每种方法能够帮助我们处理一种情况,Rxjava的强大也就在于这些方法的使用。下面大家认识一下几个比较常用的操作符(方法)
Observable.create:
这是最简单操作符,用于创建一个Observable(被观察者),该方法在上一期中已经讲了,忘了的同学请点击链接查看,原理图如下:
Observable.from:
这个操作符的作用是 将一个Iterable, 一个Future, 或者一个数组,内部通过代理的方式转换成一个Observable,并且一次发射到观察者(Observer、Subscription)中的回调中!如下例:
Observable.from(files)
.flatMap(new Func1<File, Observable<File>>() {
@Override
public Observable<File> call(File file) {
return Observable.from(file.listFiles());
}
})
Observable.just:
将一个或多个对象转换成发射这个或这些对象的一个Observable。
当一个对象的时候的流程图如下:
当多个对象的时候流程图如下:
创建的Observable会发射到观察者中去,如果多个对象会依次发射,图中表现很明显。
使用方法如下:
Observable.just(file1, file2...)
.flatMap(new Func1<File, Observable<File>>() {
@Override
public Observable<File> call(File file) {
return Observable.from(file.listFiles());
}
})
最多支持10个参数,使用者可以在源码中查看
Observable.empty/Observable.error/Observable.never:
- empty: 创建一个什么都不做直接通知完成的
- error: 创建一个什么都不做直接通知错误的Observable
- never: 创建一个什么都不做的Observable
Observable observable1 = Observable.empty();//直接调用onCompleted。
Observable observable2 = Observable.error(new RuntimeException());//直接调用onError,常用于自定义异常
Observable observable3 = Observable.never();//什么都不做
Observable.merge/zip/startWith/concat
-
merge:将多个Observable合并为一个。merge不是按照添加顺序连接,而是按照时间线来连接。其中mergeDelayError将异常延迟到其它没有错误的Observable发送完毕后才发射。而merge则是一遇到异常将停止发射数据,发送onError通知。
- zip:使用一个函数组合多个Observable发射的数据集合,然后再发射这个结果。如果多个Observable发射的数据量不一样,则以最少的Observable为标准进行压合。内部通过OperatorZip进行压合。
- zip:使用一个函数组合多个Observable发射的数据集合,然后再发射这个结果。如果多个Observable发射的数据量不一样,则以最少的Observable为标准进行压合。内部通过OperatorZip进行压合。
Observable<Integer> observable1=Observable.just(1,2,3,4);
Observable<Integer> observable2=Observable.just(4,5,6);
Observable.zip(observable1, observable2, new Func2<Integer, Integer, String>() {
@Override
public String call(Integer item1, Integer item2) {
return item1+"and"+item2;
}
}).subscribe(item->Log.d("JG",item)); //1and4,2and5,3and6
- concat: 按顺序连接多个Observables。需要注意的是Observable.concat(a,b)等价于a.concatWith(b)。
Observable<Integer> observable1=Observable.just(1,2,3,4);
Observable<Integer> observable2=Observable.just(4,5,6);
Observable.concat(observable1,observable2)
.subscribe(item->Log.d("JG",item.toString()));//1,2,3,4,4,5,6
- startWith: 在数据序列的开头增加一项数据。startWith的内部也是调用了concat
Observable.just(1,2,3,4,5)
.startWith(6,7,8)
.subscribe(item->Log.d("JG",item.toString()));//6,7,8,1,2,3,4,5
Observable.filter/distinct
- filter 过滤数据。找到符合你规则的数据。
Observable.just(3,4,5,6)
.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
return integer>0;
}
}).subscribe(item->Log.d("JG",item.toString())); //5,6
- distinct:过滤重复数据,内部通过OperatorDistinct实现。
Observable.just(3,4,5,6,3,3,4,9)
.distinct()
.subscribe(item->Log.d("JG",item.toString())); //3,4,5,6,9
更多的操作符可以去官网查看文档:链接传送门
其实,读懂上面的几个操作符,熟悉上面的图片上的流程基本能理解Rxjava的操作符。这些都只是简单了解,下期我们为大家介绍Rxjava核心的部分—–异步!
欢迎关注公众号:码老板