RxJava 常用操作符大全(一)

這裏寫圖片描述

create

create操作符是所有創建型操作符的“根”,也就是說其他創建型操作符最後都是通過create操作符來創建Observable的

調用例子如下:

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);
}

@Overridepublicvoid onError(Throwable error) {
System.err.println("Error: " + error.getMessage());
}

@Overridepublicvoid onCompleted() {
System.out.println("Sequence complete.");
}
});

運行結果如下:

    Next: 1 
    Next: 2 
    Next: 3 
    Next: 4 
    Sequence complete.

from

from操作符是把其他類型的對象和數據類型轉化成Observable

調用例子如下:

Integer[] items = { 0, 1, 2, 3, 4, 5 };
Observable myObservable = Observable.from(items);

myObservable.subscribe(
new Action1<Integer>() {
@Override
publicvoid call(Integer item) {
System.out.println(item);
}
},
        new Action1<Throwable>() {
@Override
publicvoid call(Throwable error) {
System.out.println("Error encountered: " + error.getMessage());
}
},
        new Action0() {
@Override
publicvoid call() {
System.out.println("Sequence complete");
}
}
);

運行結果如下:

    0 
    1 
    2 
    3 
    4 
    5 
    Sequence complete

just

just操作符也是把其他類型的對象和數據類型轉化成Observable,它和from操作符很像,只是方法的參數有所差別

調用例子如下:

Observable.just(1, 2, 3)
.subscribe(new Subscriber<Integer>() {
@Overridepublicvoid onNext(Integer item) {
System.out.println("Next: " + item);
}

@Overridepublicvoid onError(Throwable error) {
System.err.println("Error: " + error.getMessage());
}

@Overridepublicvoid onCompleted() {
System.out.println("Sequence complete.");
}
});

運行結果如下:

    Next: 1 
    Next: 2 
    Next: 3 
    Sequence complete.

defer

defer操作符是直到有訂閱者訂閱時,才通過Observable的工廠方法創建Observable並執行,defer操作符能夠保證Observable的狀態是最新的

下面通過比較defer操作符和just操作符的運行結果作比較

Integer i = 10;

@SuppressWarnings("unchecked")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Observable justObservable = Observable.just(i);
i = 12;
Observable deferObservable = Observable
.defer(new Func0<Observable<Integer>>() {
@Override
public Observable<Integer> 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,此時才進行真正的賦值操作

注意:不能用int

timer

timer操作符是創建一串連續的數字,產生這些數字的時間間隔是一定的;這裏有兩種情況:

一種是隔一段時間產生一個數字,然後就結束,可以理解爲延遲產生數字

一種是每隔一段時間就產生一個數字,沒有結束符,也就是是可以產生無限個連續的數字

timer操作符默認情況下是運行在一個新線程上的,當然你可以通過傳入參數來修改其運行的線程。

下面是調用例子:

Subscription observable = null;

@SuppressWarnings({ "unchecked", "deprecation" })
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
observable = Observable.timer(2, 2, TimeUnit.SECONDS)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Long>() {

@Override
public void onCompleted() {
// TODO Auto-generated method stub

}

@Override
public void onError(Throwable arg0) {
// TODO Auto-generated method stub

}

@Override
public void onNext(Long arg0) {
// TODO Auto-generated method stub
System.out.println("Next:" + arg0.toString());

}
            });
}

@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
    if (observable != null) {
observable.unsubscribe();
}
}

運行結果如下:

    Next:0 
    Next:1 
    Next:2 
    Next:3 
    ……

注意:Observable.subscribe()方法可以返回一個Subscription的對象,即我們每次訂閱都會返回,可以通過該對象,取消訂閱。

interval

interval操作符是每隔一段時間就產生一個數字,這些數字從0開始,一次遞增1直至無窮大;interval操作符的實現效果跟上面的timer操作符的第二種情形一樣。

Subscription observable = null;

@SuppressWarnings({ "unchecked", "deprecation" })
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
observable = Observable.interval(2, TimeUnit.SECONDS)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Long>() {

@Override
public void onCompleted() {
// TODO Auto-generated method stub

}

@Override
public void onError(Throwable arg0) {
// TODO Auto-generated method stub

}

@Override
public void onNext(Long arg0) {
// TODO Auto-generated method stub
System.out.println("Next:" + arg0.toString());

}
            });
}

@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
    if (observable != null) {
observable.unsubscribe();
}
}

運行結果:

這裏寫圖片描述

若不調用取消訂閱,則會一直增加。

range

range操作符是創建一組在從n開始,個數爲m的連續數字,比如range(3,10),就是創建3、4、5…12的一組數字

調用例子如下:

Subscription observable = null;

@SuppressWarnings({ "unchecked", "deprecation" })
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
observable = Observable.range(0, 10).subscribe(new Subscriber<Integer>() {

@Override
public void onCompleted() {
// TODO Auto-generated method stub
System.out.println("Sequence complete.");
}

@Override
public void onError(Throwable arg0) {
// TODO Auto-generated method stub

}

@Override
public void onNext(Integer arg0) {
// TODO Auto-generated method stub
System.out.println(""+arg0);

}
    });



}

運行結果:
這裏寫圖片描述

repeat/repeatWhen

repeat操作符是對某一個Observable,重複產生多次結果

repeatWhen操作符是對某一個Observable,有條件地重新訂閱從而產生多次結果

repeat和repeatWhen操作符默認情況下是運行在一個新線程上的,當然你可以通過傳入參數來修改其運行的線程。

repeat調用例子如下:

//連續產生兩組(1,2,3)的數字
Subscription observable = null;

@SuppressWarnings({ "unchecked", "deprecation" })
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
observable = Observable.range(1, 3).repeat(2).subscribe(new Subscriber<Integer>() {

@Override
public void onCompleted() {
// TODO Auto-generated method stub
System.out.println("onCompleted");
}

@Override
public void onError(Throwable arg0) {
// TODO Auto-generated method stub

}

@Override
public void onNext(Integer arg0) {
// TODO Auto-generated method stub
System.out.println(""+arg0);

}});
}

運行結果如下:
這裏寫圖片描述

說點什麼吧

不得不說,Rx的操作符真的是太強大了,當然,也太龐大了,所以,每個都記住也是不可能的,至少我不行。

所以,我都是記錄和學習一些常用的,很多用不到的暫時也不記錄了,有需要再Google一波,或者直接去這裏看
(英文原版)
http://reactivex.io/documentation/operators.html#alphabetical

額,英文不好的,也不慌,看這個,畢竟大多程序員英文….(並不包括我)
https://mcxiaoke.gitbooks.io/rxdocs/content/index.html

這些都詳細的一批了。

這個RxJava的系列,最後一個文也是關於Rx操作符的,我也把這些操作符都寫在了一個Demo(操作符大全)上,有興趣的(額,當然,都是爛大街的了。。。)我就不說了吧。

https://github.com/GitHuborz/RxJavaOPDemo

更多操作符,請看下回分解吧~這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章