下方展示了幾種創(chuàng)建Observable的方法
- just() ---將一個或者多個對象轉(zhuǎn)換成發(fā)射這個或這些對象的一個Observable
- from() --- 將一個Iterable,一個Future,或者一個數(shù)組轉(zhuǎn)換成一個Observable
- repeat() --- 創(chuàng)建一個重復(fù)發(fā)射指定數(shù)據(jù)或者數(shù)據(jù)序列的Observable
- repeatWhean()---創(chuàng)建一個重復(fù)發(fā)射指定數(shù)據(jù)或數(shù)據(jù)序列的Observable,它依賴于另一個Observable發(fā)射的數(shù)據(jù)
- create()---使用一個函數(shù)從頭創(chuàng)建一個Observable
- defer()---只有當(dāng)訂閱者訂閱才能創(chuàng)建Observable;為每個訂閱創(chuàng)建一個新的Observable
- range()---創(chuàng)建一個發(fā)射指定范圍的整數(shù)序列的Observable
- interval()---創(chuàng)建一個按照給定的延時之后發(fā)射單個數(shù)據(jù)的Observable
- timer()---創(chuàng)建一個在給定的延時之后發(fā)射單個數(shù)據(jù)的Observable
- empty()---創(chuàng)建一個什么都不做的直接通知完成的Observable
- error()---創(chuàng)建一個什么都不做直接通知錯誤的Observable
- never()---創(chuàng)建一個不發(fā)射任何數(shù)據(jù)的Observable
create操作符
crate操作符是所有創(chuàng)建型操作符的根,也就是說其他創(chuàng)建型的操作符最后都是通過create操作符來創(chuàng)建Observable
你可以使用Create操作符從頭開始創(chuàng)建一個Observable,給這個操作符傳遞一個接受觀察者作為參數(shù)的函數(shù),編寫這個函數(shù)讓它的行為表現(xiàn)為一個Observable--恰當(dāng)?shù)恼{(diào)用觀察者的onNext,onError和onCompleted方法。
-
一個形式正確的有限Observable必須嘗試調(diào)用觀察者的onCompleted正好一次或者它的onError正好一次,而且此后不能再調(diào)用觀察者的任何其它方法。
defer操作符
Defer操作符會一直等待直到有觀察者訂閱它,然后它使用Observable工廠方法生成一個Observable。它對每個觀察者都這樣做,因此盡管每個訂閱者都以為自己訂閱的是同一個Observable,事實上每個訂閱者獲取的是它們自己的單獨的數(shù)據(jù)序列。
在某些情況下,等待直到最后一分鐘(就是知道訂閱發(fā)生時)才生成Observable可以確保Observable包含最新的數(shù)據(jù)。
defer操作符默認(rèn)不在任何調(diào)度器上執(zhí)行
/**
* Defer
* Defer操作符只有當(dāng)有Subscriber來訂閱的時候才會創(chuàng)建一個新的Observable對象,
*/
private static void test(){
Observable.defer(new Func0<Observable<Long>>() {
//注意此處的call方法沒有Subscriber參數(shù),而create操作符有Subscriber參數(shù)
@Override
public Observable<Long> call() {
return Observable.just(System.currentTimeMillis());
}
})
.subscribe(new Subscriber<Long>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onNext(Long value) {
System.out.println("onSuccess value = " + value);
}
@Override
public void onError(Throwable error) {
System.out.println("onError error = " + error);
}
});
}
Just操作符
Just將單個數(shù)據(jù)轉(zhuǎn)換為發(fā)射那個數(shù)據(jù)的Observable。
Just類似于From,但是From會將數(shù)組或Iterable的數(shù)據(jù)取出然后逐個發(fā)射,而Just只是簡單的原樣發(fā)射,將數(shù)組或Iterable當(dāng)做單個數(shù)據(jù)。
注意:如果你傳遞null給Just,它會返回一個發(fā)射null值的Observable。不要誤認(rèn)為它會返回一個空Observable(完全不發(fā)射任何數(shù)據(jù)的Observable),如果需要空Observable你應(yīng)該使用Empty操作符。
- RxJava將這個操作符實現(xiàn)為just函數(shù),它接受一至九個參數(shù),返回一個按參數(shù)列表順序發(fā)射這些數(shù)據(jù)的Observable。
/**
* Just
* Just操作符將某個對象轉(zhuǎn)化為Observable對象,并且將其發(fā)射出去,可以使一個數(shù)字、
* 一個字符串、數(shù)組、Iterate對象等,是一種非常快捷的創(chuàng)建Observable對象的方法,在以后的例子里會大量使用。
*/
private static void test(){
Observable.just(System.currentTimeMillis())
.subscribe(new Subscriber<Long>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onNext(Long value) {
System.out.println("onSuccess value = " + value);
}
@Override
public void onError(Throwable error) {
System.out.println("onError error = " + error);
}
});
}
Defer和just操作符區(qū)別
public static Observable<Long> DeferObservable() {
return Observable.defer(new Func0<Observable<Long>>() {
@Override
public Observable<Long> call() {
return Observable.just(System.currentTimeMillis());
}
});
}
public static Observable<Long> JustObservable() {
return Observable.just(System.currentTimeMillis());
}
public static Observable<Long> deferObservable = DeferObservable();
public static Observable<Long> justObservable = JustObservable();
/**
* Defer、Just區(qū)別
* Defer:每次訂閱都會得到一個剛創(chuàng)建的最新的Observable對象,這可以確保Observable對象里的數(shù)據(jù)是最新的;
* Just:每次訂閱不會創(chuàng)建的新的Observable對象
*/
private static void test(){
deferObservable.subscribe(new Observer<Long>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onNext(Long value) {
SimpleDateFormat sdf =new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒");
System.out.println("defer onSuccess value = " + sdf.format(new Date(value)));
}
@Override
public void onError(Throwable error) {
System.out.println("onError error = " + error);
}
});
justObservable.subscribe(new Observer<Long>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onNext(Long value) {
SimpleDateFormat sdf =new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒");
System.out.println("just onSuccess value = " + sdf.format(new Date(value)));
}
@Override
public void onError(Throwable error) {
System.out.println("onError error = " + error);
}
});
}
Interval操作符
創(chuàng)建一個按固定時間間隔發(fā)射整數(shù)序列的Observable
/**
* Interval
* Interval所創(chuàng)建的Observable對象會從0開始,每隔固定的時間(long interval)發(fā)射一個數(shù)字。
* 需要注意的是這個對象是運行在computation Scheduler,所以如果需要在view中顯示結(jié)果,要在主線程中訂閱。
*/
private static void test5(){
Observable.interval(1, TimeUnit.SECONDS,Schedulers.immediate())
.subscribe(new Subscriber<Long>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onNext(Long value) {
SimpleDateFormat sdf =new SimpleDateFormat("HH時mm分ss秒");
System.out.println("onSuccess value = "+ value + ", 現(xiàn)在時間:" + sdf.format(new Date()));
}
@Override
public void onError(Throwable error) {
System.out.println("onError error = " + error);
}
});
}