學習資料:
1. 輔助操作符
1.1 delay延遲
延遲發(fā)送接收到的每一個數(shù)據(jù)項,暫時一段時間再發(fā)送。最終,所有的數(shù)據(jù)項,整體向后延遲指定的時間段
1.1.1 delay(long,TimeUnit,Schedulers)
指定延遲的時間,單位
默認在computation調(diào)度器上執(zhí)行
簡單使用:
/**
* 指定延遲時間 ,單位 , 調(diào)度線程
*/
private static void delayCount() {
Observable
.just(1,2,3)
.delay(3, TimeUnit.SECONDS, Schedulers.immediate())
.subscribe(System.out::println);
}
延遲3秒發(fā)送數(shù)據(jù)項,后一項依次延時3秒,當發(fā)送過3時,并不會立刻結(jié)束,也會延遲3秒后才結(jié)束
注意:delay
不會延遲onError()
通知,會立即將錯誤信號發(fā)送給訂閱者,并將所有呆發(fā)射的onNext()
通知全部丟棄。但delay
會延遲onCompleted()
通知
1.1.2 delay(Func1)
在Func1
函數(shù)中返回一個新的Observable
,這個新的Observable
被當作原始Observable
的延時定時器。當新的Observable
被返回時,就會發(fā)射與之相關(guān)聯(lián)的數(shù)據(jù)項
默認不在任何特定的線程執(zhí)行,在默認線程
簡單使用
/**
* Func1中的Observable當作延時定時器
*/
private static void delayFunc1() {
Observable
.just(1, 2, 3)
.delay(new Func1<Integer, Observable<Long>>() {
@Override
public Observable<Long> call(Integer integer) {
return Observable
.timer(1,TimeUnit.SECONDS,Schedulers.immediate());
// .flatMap(new Func1<Long, Observable<Integer>>() {
// @Override
// public Observable<Integer> call(Long aLong) {
// return Observable.just(integer + 10);//函數(shù)結(jié)果不會作用于原始數(shù)據(jù)項
// }
// });
}
})
.subscribe(System.out::println);
}
由于新的Observable
只是當作一個定時器,在新的Observable
中,再使用函數(shù)對原始數(shù)據(jù)項進行修改,無效
1.2 Do占位符
注冊一個動作,作為原始Observable
的生命周期
1.2.1 doOnNext(Action1)
注冊一個回調(diào),產(chǎn)生的Observable
每發(fā)送出一個數(shù)據(jù)項,當觸發(fā)onNext()
時就會回調(diào)一次
可以考慮使用這個關(guān)鍵字來對網(wǎng)絡請求結(jié)果進行緩存處理
doOnEach(Action1)
則會在觸發(fā)onNext(),onError(),onCompleted()
時都進行回調(diào)
簡單使用
/**
* 當產(chǎn)生的隨機數(shù)大于 0.8 時 ,拋出異常
*/
private static void doOnNext() {
Observable
.just(1, 2, 3)
.doOnNext(new Action1<Integer>() {
@Override
public void call(Integer integer) {
if (Math.random() > 0.8)
throw new RuntimeException("throw Exception");
}
})
.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println(e.getMessage());
}
@Override
public void onNext(Integer integer) {
System.out.println("This is --> " + integer);
}
});
}
doOnEach簡單使用
private static void doOnEach() {
Observable
.just(1, 2, 3, 4)
.doOnEach(new Action1<Notification<? super Integer>>() {
@Override
public void call(Notification<? super Integer> notification) {
System.out.println(notification.getKind()
+ "---" + notification.getThrowable()
+ "---" + notification.getValue());
}
})
.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println(e.getMessage());
}
@Override
public void onNext(Integer integer) {
System.out.println("This is --> " + integer);
}
});
}
運行結(jié)果:
OnNext---null---1
This is --> 1
OnNext---null---2
This is --> 2
OnNext---null---3
This is --> 3
OnNext---null---4
This is --> 4
OnCompleted---null---null
onCompleted
getKind()
的值可以直接看作是觸發(fā)信號
getThrowable()
獲取異常信息對象Throwable
getValue()
值就是數(shù)據(jù)項
在輸出結(jié)果的最后,當觸發(fā)onCompleted()
時,又進行了一次doOnEach()
回調(diào)
1.2.2 doOnSubscribe(Action0)
當Observable
訂閱Observer
之前,會回調(diào)doOnSubcribe()
,默認在subscribe()
訂閱線程執(zhí)行,但可以通過subscribeOn()
來指定執(zhí)行線程,受其后最近的一個subscribeOn()
影響
簡單使用:
private static void doOnSubscribe() {
Observable
.just(1,2,3,4)
.doOnSubscribe(new Action0() {
@Override
public void call() {
System.out.println("-1");
}
})
.subscribeOn(Schedulers.io())
.map(integer -> integer + 10)
.subscribeOn(Schedulers.immediate())
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.print(integer +", ");
}
}); }
運行結(jié)果:
-1
11, 12, 13, 14
1.2.3 doOnTerminate(Action0)
doOnTerminate
訂閱了一個動作后,當它產(chǎn)生的Observable終止之前會被調(diào)用,無論是正常還是異常終止
簡單使用:
private static void doOnTerminate() {
Observable
.just(1, 2, 3, 4)
.map(integer -> {
if (Math.random() < 0.8)
return integer + 10;
else
throw new RuntimeException("Throw Exception");
})
.doOnTerminate(new Action0() {
@Override
public void call() {
System.out.println("doOnTerminate --> -1");
}
})
.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println(e.getMessage());
}
@Override
public void onNext(Integer integer) {
System.out.println("This is --> " + integer);
}
});
}
無論是否拋出異常,都會在最終結(jié)束之前,輸出打印doOnTerminate --> -1
1.3 TimeOut
原始Observable
在指定的時間內(nèi)沒有發(fā)送任何數(shù)據(jù)項,就會發(fā)出onError()
錯誤信號通知
簡單使用:
/**
* 根據(jù)隨機數(shù),線程睡眠
*/
private static void timeoutLong() {
Observable
.interval(1, TimeUnit.SECONDS, Schedulers.immediate())
.map(aLong -> {
if (Math.random() > 0.8) {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "This is -->" + aLong;
})
.timeout(2, TimeUnit.SECONDS)
.limit(5)
.subscribe(System.out::println);
}
1.4 ObserveOn和SubscribeOn
-
ObserveOn
:指定觀察者在哪個線程進行調(diào)度。可以理解為也就是指定onNext,onError,onCompleted
執(zhí)行的線程 -
SubscribeOn
:指定Observable
被觀察者自身所在的線程。
注意:遇到異常時,ObserveOn
會立刻發(fā)送onError
通知,不會等待慢速消費的Observable
接受任何之前已經(jīng)收到但還沒有發(fā)送出去的數(shù)據(jù)項。
2. 最后
本人很菜,有錯誤,請指出
共勉 :)