之前沒有了解過Rxjava的童鞋,建議先閱讀《Rxjava 從入門到開發》這篇文章,對入門比較有幫助。
StartWith操作符
作用:在數據序列的開頭增加一項數據
Observable.just(1,2).startWith(Observable.just(-1)).observeOn(Schedulers.io()).subscribe(new Action1<Integer>() {
@Override
public void call(Integer aLong) {
Logger.i(String.valueOf(aLong));
}
});
輸出結果:
例子說明:在Startwith的作用下-1輸出在結果的最前面。
CombineLatest操作符
作用:當兩個Observables中的任何一個發射了數據時,使用一個函數結合每個Observable發射的最近數據項,并且基于這個函數的結果發射數據。
//產生0,5,10數列
Observable<Long> observable1 = Observable.interval(1000, TimeUnit.MILLISECONDS)
.map(new Func1<Long, Long>() {
@Override
public Long call(Long aLong) {
return aLong * 5;
}
}).take(3);
//產生0,10,20數列
Observable<Long> observable2 = Observable.interval(500, TimeUnit.MILLISECONDS)
.map(new Func1<Long, Long>() {
@Override
public Long call(Long aLong) {
return aLong * 10;
}
}).take(3);
subscription=Observable.combineLatest(observable1, observable2, new Func2<Long, Long, Long>() {
@Override
public Long call(Long aLong, Long aLong2) {
System.out.println("aLong: " + aLong+" aLong2: "+aLong2);
return aLong+aLong2;
}
}).subscribe(new Subscriber<Long>() {
@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(Long aLong) {
System.out.println("Next: " + aLong);
}
});
輸出結果:
例子說明:observable1輸出的是0,5,10;observable2輸出的是0,10,20,輸出結果的關系如下圖:
數字的間隔就是時間差。
Join操作符
作用:join操作符把類似于combineLatest操作符,也是兩個Observable產生的結果進行合并,合并的結果組成一個新的Observable,但是join操作符可以控制每個Observable產生結果的生命周期,在每個結果的生命周期內,可以與另一個Observable產生的結果按照一定的規則進行合并。
join方法有四個參數,具體定義如下:
observableA.join(observableB, observableA產生結果生命周期控制函數, observableB產生結果生命周期控制函數, observableA產生的結果與observableB產生的結果的合并規則)
//產生0,5數列
Observable<Long> observable1 = Observable.interval(1000, TimeUnit.MILLISECONDS)
.map(new Func1<Long, Long>() {
@Override
public Long call(Long aLong) {
return aLong * 5;
}
}).take(3);
//產生0,10,20數列
Observable<Long> observable2 = Observable.interval(1000, TimeUnit.MILLISECONDS)
.map(new Func1<Long, Long>() {
@Override
public Long call(Long aLong) {
return aLong * 10;
}
}).take(3);
subscription=observable1.join(observable2, new Func1<Long, Observable<Long>>() {
@Override
public Observable<Long> call(Long aLong) {
return Observable.just(aLong).delay(500, TimeUnit.MILLISECONDS);
}
}, new Func1<Long, Observable<Long>>() {
@Override
public Observable<Long> call(Long aLong) {
return Observable.just(aLong).delay(1000, TimeUnit.MILLISECONDS);
}
}, new Func2<Long, Long, Long>() {
@Override
public Long call(Long aLong, Long aLong2) {
System.out.println("aLong: " + aLong+" aLong2: "+aLong2);
return aLong + aLong2;
}
}).subscribe(new Subscriber<Long>() {
@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(Long aLong) {
System.out.println("Next: " + aLong);
}
});
輸出結果:
例子說明:其實輸出排列方式和combineLatest差不多,主要差別在通過join可以進一步控制observable結果的輸出時間周期,另外順便一提的是如果observable1輸出的數據只有兩個,那么即使observable2輸出3個數據,但最終輸出的也僅有兩個。
Merge操作符
作用:將多個Observable合并為一個。
//產生0,5數列
Observable<Long> observable1 = Observable.interval(1000, TimeUnit.MILLISECONDS)
.map(new Func1<Long, Long>() {
@Override
public Long call(Long aLong) {
return aLong * 5;
}
}).take(2);
//產生0,10,20數列
Observable<Long> observable2 = Observable.interval(1000, TimeUnit.MILLISECONDS)
.map(new Func1<Long, Long>() {
@Override
public Long call(Long aLong) {
return aLong * 10;
}
}).take(3);
subscription=Observable.merge(observable1,observable2).subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
System.out.println("out: " + aLong);
}
});
輸出結果:
例子說明:把observable1,observable2的數據合并輸出。
switchOnNext操作符
作用:把一組Observable轉換成一個Observable,轉換規則為:對于這組Observable中的每一個Observable所產生的結果,如果在同一個時間內存在兩個或多個Observable提交的結果,只取最后一個Observable提交的結果給訂閱者。
Observable<Observable<Long>> observable = Observable.interval(500, TimeUnit.MILLISECONDS).map(new Func1<Long, Observable<Long>>() {
@Override
public Observable<Long> call(Long aLong) {
//每隔200毫秒產生一組數據(0,10,20,30,40)
return Observable.interval(200, TimeUnit.MILLISECONDS).map(new Func1<Long, Long>() {
@Override
public Long call(Long aLong) {
return aLong * 10;
}
}).take(3);
}
}).take(2);
subscription=Observable.switchOnNext(observable).subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
System.out.println("Next:" + aLong);
}
});
輸出結果:
例子說明:沒人Switch的作用下,輸出結果為“0,10,20,0,10,20”,但是在Switch的作用下,結果為“0,10,0,10,20”,少了“20”,這就是switch的作用。
zip操作符
作用:把兩個observable提交的結果,嚴格按照順序進行合并。
Observable<Long> observable1= Observable.interval(1, TimeUnit.SECONDS).take(3);
Observable<Long> observable2= Observable.interval(1, TimeUnit.SECONDS).take(4);
subscription=Observable.zip(observable1, observable2, new Func2<Long, Long, Integer>() {
@Override
public Integer call(Long aLong, Long aLong2) {
System.out.println("aLong:" + aLong+" aLong2: "+aLong2);
return (int) (aLong+aLong);
}
}).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println("result:" + integer);
}
});
輸出結果:
例子說明:最終輸出為“0,2,4”,兩個Observable輸出的數據一一按順序對應,無法對應的數據就拋棄,例子中的observable2本應該輸出4個數據take(4)但是由于操作符zip的作用下,最終只輸出3個數據。
以上便是結合操作符的主要內容了。rxjava的主要操作符講了差不多,有啥問題歡迎大家留言交流下??,歡迎關注。
附錄:
文章demo