創(chuàng)建型操作符
- create
- from
- just
- defer
- timer
- interval
- range
- repeat/repeatWhen
create操作符
create操作符是所有創(chuàng)建型操作符的“根”沃琅,也就是說其他創(chuàng)建型操作符最后都是通過create操作符來創(chuàng)建Observable的.
Observable.create(new Observable.OnSubscribe() {
@Override
public void call (Subscriber 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() {
@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("Sequence complete.");
}
});
運行結(jié)果如下:
Next: 1
Next: 2
Next: 3
Next: 4
Sequence complete.
from操作符
from操作符是把其他類型的對象和數(shù)據(jù)類型轉(zhuǎn)化成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("Sequence complete");
}
}
);
運行結(jié)果如下:
Next: 1
Next: 2
Next: 3
Next: 4
Sequence complete.
just操作符
just操作符也是把其他類型的對象和數(shù)據(jù)類型轉(zhuǎn)化成Observable忽肛,它和from操作符很像昵济,只是方法的參數(shù)有所差別
Observable.just(1, 2, 3)
.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("Sequence complete.");
}
});
運行結(jié)果如下:
Next: 1
Next: 2
Next: 3
Sequence complete.
defer操作符
defer操作符是直到有訂閱者訂閱時袱结,才通過Observable的工廠方法創(chuàng)建Observable并執(zhí)行美莫,defer操作符能夠保證Observable的狀態(tài)是最新的.
// 下面通過比較defer操作符和just操作符的運行結(jié)果作比較:
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());
}
});
}
運行結(jié)果如下:
just result:10
defer result:15
timer操作符
timer操作符是創(chuàng)建一串連續(xù)的數(shù)字菜拓,產(chǎn)生這些數(shù)字的時間間隔是一定的;
一種是隔一段時間產(chǎn)生一個數(shù)字系宫,然后就結(jié)束索昂,可以理解為延遲產(chǎn)生數(shù)字 。
一種是每隔一段時間就產(chǎn)生一個數(shù)字扩借,沒有結(jié)束符椒惨,也就是是可以產(chǎn)生無限個連續(xù)的數(shù)字 。
timer操作符默認情況下是運行在一個新線程上的潮罪,當然你可以通過傳入?yún)?shù)來修改其運行的線程.
//每隔兩秒產(chǎn)生一個數(shù)字
Observable.timer(2, 2, TimeUnit.SECONDS).subscribe(new Subscriber<Long>() {
@Override
public void onCompleted() {
System.out.println("Sequence complete.");
}
@Override
public void onError(Throwable e) {
System.out.println("error:" + e.getMessage());
}
@Override
public void onNext(Long aLong) {
System.out.println("Next:" + aLong.toString());
}
});
運行結(jié)果如下:
Next:0
Next:1
Next:2
Next:3
……
interval操作符
interval操作符是每隔一段時間就產(chǎn)生一個數(shù)字康谆,這些數(shù)字從0開始,一次遞增1直至無窮大嫉到;
interval操作符的實現(xiàn)效果跟上面的timer操作符的第二種情形一樣沃暗。
interval操作符默認情況下是運行在一個新線程上的,當然你可以通過傳入?yún)?shù)來修改其運行的線程何恶。調(diào)用例子就不列出了孽锥,基本跟上面timer的調(diào)用例子一樣。
Observable.interval(3,10,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("*************Next*************:" + aLong.toString());
}
});
運行結(jié)果如下: (開始等待三秒)
*************Next*************: 0
*************Next*************:1(隔10秒)
*************Next*************:2(隔10秒)
range操作符
range操作符是創(chuàng)建一組在從n開始细层,個數(shù)為m的連續(xù)數(shù)字惜辑,比如range(3,10),就是創(chuàng)建3疫赎、4盛撑、5…12的一組數(shù)字
//產(chǎn)生從3開始,個數(shù)為10個的連續(xù)數(shù)字
Observable.range(3,10).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("Sequence complete.");
}
@Override
public void onError(Throwable e) {
System.out.println("error:" + e.getMessage());
}
@Override
public void onNext(Integer i) {
System.out.println("Next:" + i.toString());
}
});
運行結(jié)果如下:
Next:3
Next:4
Next:5
Next:6
….
Next:12
Sequence complete.
repeat/repeatWhen操作符
repeat操作符是對某一個Observable捧搞,重復產(chǎn)生多次結(jié)果抵卫。
repeatWhen操作符是對某一個Observable,有條件地重新訂閱從而產(chǎn)生多次結(jié)果实牡。
repeat和repeatWhen操作符默認情況下是運行在一個新線程上的陌僵,當然你可以通過傳入?yún)?shù)來修改其運行的線程轴合。
- repeat調(diào)用例子如下:
//連續(xù)產(chǎn)生兩組(3,4,5)的數(shù)字
Observable.range(3,3).repeat(2).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("Sequence complete.");
}
@Override
public void onError(Throwable e) {
System.out.println("error:" + e.getMessage());
}
@Override
public void onNext(Integer i) {
System.out.println("Next:" + i.toString());
}
});
運行結(jié)果如下:
Next:3
Next:4
Next:5
Next:3
Next:4
Next:5
Sequence complete.
- repeatWhen調(diào)用例子如下:
Observable.just(1,2,3).repeatWhen(new Func1<Observable<? extends Void>, Observable<?>>() {
@Override
public Observable<?> call(Observable<? extends Void> observable) {
//重復3次
return observable.zipWith(Observable.range(1, 3), new Func2<Void, Integer, Integer>() {
@Override
public Integer call(Void aVoid, Integer integer) {
return integer;
}
}).flatMap(new Func1<Integer, Observable<?>>() {
@Override
public Observable<?> call(Integer integer) {
System.out.println("delay repeat the " + integer + " count");
//1秒鐘重復一次
return Observable.timer(1, TimeUnit.SECONDS);
}
});
}
}).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("Sequence complete.");
}
@Override
public void onError(Throwable e) {
System.err.println("Error: " + e.getMessage());
}
@Override
public void onNext(Integer value) {
System.out.println("Next:" + value);
}
});
運行結(jié)果如下:
Next:1
Next:2
Next:3
repeat the 1 count
Next:1
Next:2
Next:3
repeat the 2 count
Next:1
Next:2
Next:3
repeat the 3 count
Next:1
Next:2
Next:3
Sequence complete.