在上篇文章Rxjava 從入門到開發(fā)文中我就說過會繼續(xù)寫一個關(guān)于rxjava操作符系列的文章烙如,沒有看過Rxjava 從入門到開發(fā)這篇文章的建議還是看看姓迅,對入門比較有幫助牙寞,如果通過文章學(xué)習(xí)之后痊焊,對rxjava不是很了解的話,那就對著rxjava的操作符一個個學(xué)習(xí)每個操作符的用法芳绩,有熱心人士已經(jīng)把rxjava的wiki翻譯了ReactiveX/RxJava文檔中文版,學(xué)習(xí)里面的內(nèi)容撞反,那么rxjava也就差不多學(xué)會了妥色,但是個人覺得還是不夠通俗易懂(可能自己的理解能力有問題吧??),所以接下來會把常用的操作符結(jié)合翻譯還有自己理解遏片,把使用心得記錄下來嘹害。一句話就是:“加深自己的理解,也希望給大家?guī)韺W(xué)習(xí)思路”吮便,好了廢話不多說笔呀,現(xiàn)在就開始rxjava操作符系列吧。
create操作符
作用:新創(chuàng)建一個Observable
Observable.create(new Observable.OnSubscribe<Integer>(){
@Override
public void call(Subscriber<? super Integer> subscriber) {
for(int i=0;i<3;i++){
subscriber.onNext(i);
}
subscriber.onCompleted();
}
}).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Logger.i(String.valueOf(integer));
}
});
輸出結(jié)果:
例子說明:在新建的Observable的OnSubscribe中通過傳入的subscriber發(fā)射0到2到Action1髓需。许师。例子比較簡單,繼續(xù)往下走。
Just操作符
作用:將一個或多個對象轉(zhuǎn)換成發(fā)射這個或這些對象的一個Observable
Observable.just("one","two","three").subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Logger.i("just complete..");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Logger.i("just "+s);
}
});
輸出結(jié)果:
例子說明:just后面?zhèn)魅?one","two","three"三個String常量微渠,在Subscriber的onNext方法中就會依次輸出"one","two","three"還有"just complete.."
from操作符
作用:將一個Iterable, 一個Future, 或者一個數(shù)組轉(zhuǎn)換成一個Observable
Integer[] item={1,2};
subscription=Observable.from(item).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Logger.i( "form " + integer);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Logger.e( "error: "+throwable.getMessage());
}
}, new Action0() {
@Override
public void call() {
Logger.i("from complete");
}
});
輸出結(jié)果:
例子說明:from后面?zhèn)魅隝nteger[]數(shù)組 item搭幻,在Action1就會一次輸出“form 1”,“form 2”,Action0會輸出"from complete"。
在這里總結(jié)下just逞盆,from檀蹋,create的區(qū)別:just和from通過代碼追蹤進(jìn)去看到其實(shí)他們還是調(diào)用了create操作符,just傳入的一個或者多個對象纳击,from傳入的是一個Iterable**
interval操作符
作用:創(chuàng)建一個按照給定的時間間隔發(fā)射整數(shù)序列的Observable
Observable.interval(2, TimeUnit.SECONDS).map(new Func1<Long, String>() {
@Override
public String call(Long aLong) {
return String.valueOf(aLong).concat(" :seconds");
}
}).observeOn(Schedulers.io()).subscribe(new Action1<String>() {
@Override
public void call(String s) {
Logger.i(s);
}
});
輸出結(jié)果:
例子說明:interval操作符會一直輸出0到N的整數(shù)续扔,輸出的頻率由interval傳入的數(shù)字和時間單位決定,例子中設(shè)定為2秒鐘打印一次焕数。
range操作符
作用:創(chuàng)建一個發(fā)射指定范圍的整數(shù)序列的Observable
Observable.range(0,2).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Logger.i(String.valueOf(integer));
}
});
輸出結(jié)果:
例子說明:range(x,y) x為最初打印的數(shù)纱昧,y是范圍,例子就是打印出了初始值為1堡赔,然后依次打印2個依次+1的整數(shù)识脆。
timer操作符
作用:創(chuàng)建一個在給定的延時之后發(fā)射單個數(shù)據(jù)的Observable
Observable.timer(2, TimeUnit.SECONDS).subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
Logger.i(String.valueOf(aLong));
}
});
輸出結(jié)果:
例子說明:指定延遲的時間,到達(dá)時間值后會輸出一個特殊值“0”善已。
defer操作符
作用:只有當(dāng)訂閱者訂閱才創(chuàng)建Observable灼捂;為每個訂閱創(chuàng)建一個新的Observable
先貼代碼
final Value value=new Value();
value.setText("小白");
Observable<String> observable= Observable.just(value.getText());
value.setText("小黑");
subscription=observable.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Logger.i(s);
}
});
例子說明:代碼很簡單,Value是一個類换团,里面只有一個String變量text悉稠,上面代碼編譯之后,大家想想打印出來的結(jié)果是什么艘包?很多人會覺得結(jié)果打印出來的是“小黑”的猛,但是實(shí)際上打印出來的是“小白”,為什么?其實(shí)因?yàn)楫?dāng)使用just或者from操作符的時候想虎,value.gettext就已經(jīng)被調(diào)用卦尊,那么我們?nèi)绾螌?shí)現(xiàn)訂閱的時候才輸出呢?答案就是用defer操作符舌厨,再貼下代碼岂却。。
final Value value=new Value();
value.setText("小白");
Observable<String> observable= Observable.defer(new Func0<Observable<String>>() {
@Override
public Observable<String> call() {
return Observable.just(value.getText());
}
});
value.setText("小黑");
subscription=observable.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Logger.i(s);
}
});
例子說明:通過使用defer操作符就可以實(shí)現(xiàn)訂閱的時候才執(zhí)行just的代碼裙椭,最后輸出的結(jié)果就是我們想要的“小黑”躏哩。
除了defer操作符之外,我也試過用create操作符也可以實(shí)現(xiàn)上述的功能揉燃,但是create操作符并不是專門用來處理訂閱才創(chuàng)建Observable的功能震庭,所以建議大家還是用defer比較好。
repeat操作符
作用:創(chuàng)建一個重復(fù)發(fā)射指定數(shù)據(jù)或數(shù)據(jù)序列的Observable
Observable.just("110").repeat(2).subscribe(new Action1<String>() {
@Override
public void call(String s) {
Logger.i(s);
}
});
輸出結(jié)果:
例子說明:repeat后面?zhèn)魅胨枰貜?fù)次數(shù)的值你雌,結(jié)果輸出兩次“110”
以上便是創(chuàng)建操作符的主要內(nèi)容了。有啥問題歡迎大家留言交流下??,下篇文章再說說變換操作符歡迎關(guān)注婿崭。
附錄:
文章demo