RxJava操作符分类很多,这篇文章讲一下创建型操作符。
1.Create
create操作符是所有创建型操作符的“根”,也就是说其他创建型操作符最后都是通过create操作符来创建Observable的,其流程图例如下:
create.png
示例代码:
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> observer) {
try {
if (!observer.isUnsubscribed()) {
for (int i = 1; i < 5; i++) {
observer.onNext(i);
}
observer.onCompleted();
}
} catch (Exception e) {
observer.onError(e);
}
}
} ).subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) {
System.out.println("Next: " + item);
}
@Override
public void onError(Throwable error) {
System.err.println("Error: " + error.getMessage());
}
@Override
public void onCompleted() {
System.out.println("onCompleted.");
}
});
运行结果如下:
Next: 1
Next: 2
Next: 3
Next: 4
onCompleted.
在使用create操作符时,最好要在回调的call函数中增加isUnsubscribed的判断,以便在subscriber在取消订阅时不会再执行call函数中相关代码逻辑,从而避免导致一些意想不到的错误出现;
2.From
from操作符是把其他类型的对象和数据类型转化成Observable,其流程图例如下:
示例代码:
Integer[] items = { 0, 1, 2, 3, 4, 5 };
Observable myObservable = Observable.from(items);
myObservable.subscribe(
new Action1<Integer>() {
@Override
public void call(Integer item) {
System.out.println(item);
}
},
new Action1<Throwable>() {
@Override
public void call(Throwable error) {
System.out.println("Error encountered: " + error.getMessage());
}
},
new Action0() {
@Override
public void call() {
System.out.println("onCompleted");
}
}
);
运行结果如下:
0
1
2
3
4
5
onCompleted
3.Just
just操作符也是把其他类型的对象和数据类型转化成Observable,它和from操作符很像,只是方法的参数有所差别,其流程图例如下:
示例代码:
Observable.just(1, 2, 3)
.subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer integer) {
System.out.println("Next: " + integer);
}
@Override
public void onError(Throwable error) {
System.err.println("Error: " + error.getMessage());
}
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
});
运行结果如下:
Next: 1
Next: 2
Next: 3
onCompleted
4.Defer
defer操作符是直到有订阅者订阅时,才通过Observable的工厂方法创建Observable并执行,defer操作符能够保证Observable的状态是最新的,其流程实例如下:
下面通过比较defer操作符和just操作符的运行结果作比较:
int i=10;
Observable justObservable = Observable.just(i);
i=12;
Observable deferObservable = Observable.defer(new Func0<Observable<Object>>() {
@Override
public Observable<Object> call() {
return Observable.just(i);
}
});
i=15;
justObservable.subscribe(new Subscriber() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Object o) {
System.out.println("just result:" + o.toString());
}
});
deferObservable.subscribe(new Subscriber() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Object o) {
System.out.println("defer result:" + o.toString());
}
});
运行结果如下:
just result:10
defer result:15
可以看到,just操作符是在创建Observable就进行了赋值操作,而defer是在订阅者订阅时才创建Observable,此时才进行真正的赋值操作。
5.Interval
interval.png- Interval操作符返回一个Observable,它按固定的时间间隔发射一个无限递增的整数序列;
- 它接受一个表示时间间隔的参数和一个表示时间单位的参数
- interval默认在computation调度器上执行。你也可以传递一个可选的Scheduler参数来指定调度器。
示例代码:
//以秒为单位,每隔1秒发射一个数据
Observable.interval(1, TimeUnit.SECONDS)
.subscribe(new Subscriber<Long>() {
@Override
public void onCompleted() {
System.out.println("onCompleted" );
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Long aLong) {
System.out.println("interval:" + aLong);
}
});
运行结果如下:
interval:0
interval:1
interval:2
interval:3
......
6.Range
- range操作符创建一个发射指定范围的整数序列的Observable,你可以指定范围的起始和长度。
- 它接受两个参数,一个是范围的起始值,一个是范围的数据的数目。如果你将第二个参数设为0,将导致Observable不发射任何数据(如果设置为负数,会抛异常)
- range默认不在任何特定的调度器上执行。有一个变体可以通过可选参数指定Scheduler。
示例代码:
Observable.range(1, 6).subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) {
System.out.println("Next: " + item);
}
@Override
public void onError(Throwable error) {
}
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
});
运行结果如下:
Next: 1
Next: 2
Next: 3
Next: 4
Next: 5
Next: 6
onCompleted
7.Repeat
repeat.png- repeat重复地发射数据。某些实现允许你重复的发射某个数据序列,还有一些允许你限制重复的次数。
- 它不是创建一个Observable,而是重复发射原始Observable的数据序列,这个序列或者是无限的,或者通过repeat(n)指定重复次数。
- repeat操作符默认在trampoline调度器上执行。有一个变体可以通过可选参数指定Scheduler。
示例代码:
//重复5次发送数据1
Observable.just(1).repeat(5).subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) {
System.out.println("Next: " + item);
}
@Override
public void onError(Throwable error) {
System.err.println("Error: " + error.getMessage());
}
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
});
运行结果如下:
Next: 1
Next: 1
Next: 1
Next: 1
Next: 1
onCompleted
8.Timer
timer.png
- timer操作符创建一个在给定的时间段之后返回一个特殊值的Observable
- timer返回一个Observable,它在延迟一段给定的时间后发射一个简单的数字0
- timer操作符默认在computation调度器上执行。有一个变体可以通过可选参数指定Scheduler
示例代码:
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String beginTime = sdf.format(new Date());
System.out.println("beginTime : " + beginTime);
Observable.timer(2, TimeUnit.SECONDS)//从0开始发射数据
.subscribe(new Subscriber<Long>() {
@Override
public void onNext(Long item) {
//2秒后发射了一个数据
System.out.println("Next: " + item);
String endTime = sdf.format(new Date());
System.out.println("endTime :" + endTime);
}
@Override
public void onError(Throwable error) {
System.err.println("Error: " + error.getMessage());
}
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
});
运行结果如下:
beginTime : 16:15:12
Next: 0
endTime :16:15:14
onCompleted
网友评论