有幾種模式是你真的想要弄明白的。
Single~SingleObserver 單一發(fā)送
CompositeDisposable~DisposableObserver 防止內(nèi)存泄露
Completable~CompletableObserver
PublishSubject~ConnectableObservable 熱觀(guān)察者
ReplaySubject !Observer重復(fù)發(fā)送
Flowable 背壓
BehaviorSubject~Observer 在訂閱的時(shí)候接收上一次發(fā)送的最后一個(gè)數(shù)據(jù)
~1 single
如果你發(fā)現(xiàn)需要用到一個(gè) Observable 的操作符而 Single 并不支持,你可以用 toObservable 操作符把 Single<T> 轉(zhuǎn)換為 Observable<T> 。
<pre>
Single.just("Amit")
.subscribe(new SingleObserver<String>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, " onSubscribe : " + d.isDisposed());
}
@Override
public void onSuccess(String value) {
textView.append(" onNext : value : " + value);
textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onNext value : " + value);
}
@Override
public void onError(Throwable e) {
textView.append(" onError : " + e.getMessage());
textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onError : " + e.getMessage());
}
};;
</pre>
執(zhí)行到
SingleJust的subscribeActual的方法
<pre>
@Override
protected void subscribeActual(SingleObserver<? super T> s) {
s.onSubscribe(Disposables.disposed());
s.onSuccess(value);
}
</pre>
我們可以看到這個(gè)只是調(diào)用一個(gè),single單一的發(fā)送一個(gè)數(shù)據(jù)
single是一個(gè)observable ,但不是發(fā)射一系列的值,無(wú)論是從無(wú)處到無(wú)限數(shù),它總是發(fā)出一個(gè)值或一個(gè)錯(cuò)誤通知。
2~Completable
使用完備時(shí)我們忽略O(shè)nNext事件,只處理完全和OnError事件
Completable 本質(zhì)上來(lái)說(shuō)和 Observable 與 Single 不一樣,因?yàn)樗话l(fā)射數(shù)據(jù)。因此 Completable 的操作符也有所區(qū)別,最常用的是 andThen 。在這個(gè)操作符中你可以傳任何 Observable 、 Single 、 Flowable 、 Maybe 或者其他 Completable ,它們會(huì)在原來(lái)的 Completable 結(jié)束后執(zhí)行。例如。你想執(zhí)行一些其他操作(Single):
<pre>
apiClient.updateMyData(myUpdatedData)
.andThen(performOtherOperation()) // a Single<OtherResult>
.subscribe(new Consumer<OtherResult>() {
@Override
public void accept(OtherResult result) throws Exception {
// handle otherResult
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception{
// handle error
}
});
</pre>
跟 Single 不同的是 RxJava 不允許直接把 Observable 轉(zhuǎn)換為 Completable,因?yàn)闆](méi)辦法知道一個(gè) Observable 什么時(shí)候 complete。但是你可以把 Single 轉(zhuǎn)換為 Completable,因?yàn)?Single 保證 onComplete 會(huì)被調(diào)用,這個(gè)操作符是 toCompletable 。
3~Flowable 專(zhuān)門(mén)處理背壓
<pre>
Flowable<Integer> observable = Flowable.just(1, 2, 3, 4);
observable.reduce(50, new BiFunction<Integer, Integer, Integer>() {
@Override
public Integer apply(Integer t1, Integer t2) {
return t1 + t2;
}
}).subscribe(getObserver());
</pre>
3~CompositeDisposable
這個(gè)作用其實(shí)主要是節(jié)省內(nèi)存用
它提供了了add,clear等方法。
在
protected void onDestroy() {
super.onDestroy();
disposables.clear(); // do not send event after activity has been destroyed
}
防止內(nèi)存溢出
4PublishSubject
先說(shuō)一點(diǎn)介紹
一旦訂閱了,將所有隨后觀(guān)察到的項(xiàng)發(fā)送給訂閱方。 如同字面解釋一樣。 下面是官方的解釋
<pre>
PublishSubject<Object> subject = PublishSubject.create();
// observer1 will receive all onNext and onComplete events
subject.subscribe(observer1);
subject.onNext("one");
subject.onNext("two");
// observer2 will only receive "three" and onComplete
subject.subscribe(observer2);
subject.onNext("three");
subject.onComplete();
這個(gè)PublishSubject就是我們說(shuō)的熱訂閱者。他在訂閱了之后就會(huì)一直訂閱數(shù)據(jù)。第二次訂閱了之后不會(huì)從頭開(kāi)始接受數(shù)據(jù)。而是從后面開(kāi)始。
</pre>
然后說(shuō)說(shuō)這個(gè)ConnectableObservable
就是一種特殊的Observable對(duì)象,并不是Subscrib的時(shí)候就發(fā)射數(shù)據(jù),而是只有對(duì)其應(yīng)用connect操作符的時(shí)候才開(kāi)始發(fā)射數(shù)據(jù),所以可以用來(lái)更靈活的控制數(shù)據(jù)發(fā)射的時(shí)機(jī)
需要注意的是如果發(fā)射數(shù)據(jù)已經(jīng)開(kāi)始了再進(jìn)行訂閱只能接收以后發(fā)射的數(shù)據(jù)。
<pre>
PublishSubject<Integer> source = PublishSubject.create();
ConnectableObservable<Integer> connectableObservable = source.replay(2); // bufferSize = 3 to retain 3 values to replay
connectableObservable.connect(); // connecting the connectableObservable
connectableObservable.subscribe(getFirstObserver());
source.onNext(1);
source.onNext(2);
source.onNext(3);
source.onNext(4);
source.onComplete();
/*
* it will emit 2, 3, 4 as (count = 3), retains the 3 values for replay
*/
connectableObservable.subscribe(getSecondObserver());
</pre>
Replay操作符返回一個(gè)Connectable Observable 對(duì)象并且可以緩存其發(fā)射過(guò)的數(shù)據(jù),這樣即使有訂閱者在其發(fā)射數(shù)據(jù)之后進(jìn)行訂閱也能收到其之前發(fā)射過(guò)的數(shù)據(jù)。不過(guò)使用Replay操作符我們最好還是限定其緩存的大小,否則緩存的數(shù)據(jù)太多了可會(huì)占用很大的一塊內(nèi)存。對(duì)緩存的控制可以從空間和時(shí)間兩個(gè)方面來(lái)實(shí)現(xiàn)。
這個(gè)就是還存了兩個(gè)數(shù)據(jù)
5ReplaySubject
/* ReplaySubject emits to any observer all of the items that were emitted
* by the source Observable, regardless of when the observer subscribes.
*/
從這個(gè)圖中我們應(yīng)該很好理解,當(dāng)你訂閱的時(shí)候就會(huì)發(fā)送數(shù)據(jù)
<pre>
ReplaySubject<Integer> source = ReplaySubject.create();
source.subscribe(getFirstObserver()); // it will get 1, 2, 3, 4
source.onNext(1);
source.onNext(2);
source.onNext(3);
source.onNext(4);
source.onComplete();
/*
* it will emit 1, 2, 3, 4 for second observer also as we have used replay
*/
source.subscribe(getSecondObserver());
</pre>
因?yàn)檫@個(gè)是重復(fù)發(fā)送數(shù)據(jù)。當(dāng)你訂閱的時(shí)候。就會(huì)重復(fù)發(fā)送
7BehaviorSubject
<pre>
BehaviorSubject<Integer> source = BehaviorSubject.create();
source.subscribe(getFirstObserver()); // it will get 1, 2, 3, 4 and onComplete
source.onNext(1);
source.onNext(2);
source.onNext(3);
/*
* it will emit 3(last emitted), 4 and onComplete for second observer also.
*/
source.subscribe(getSecondObserver());
source.onNext(4);
source.onComplete()
</pre>
<pre>
// observer will receive all 4 events (including "default").
BehaviorSubject<Object> subject = BehaviorSubject.createDefault("default");
subject.subscribe(observer);
subject.onNext("one");
subject.onNext("two");
subject.onNext("three");
// observer will receive the "one", "two" and "three" events, but not "zero"
BehaviorSubject<Object> subject = BehaviorSubject.create();
subject.onNext("zero");
subject.onNext("one");
subject.subscribe(observer);
subject.onNext("two");
subject.onNext("three");
// observer will receive only onComplete
BehaviorSubject<Object> subject = BehaviorSubject.create();
subject.onNext("zero");
subject.onNext("one");
subject.onComplete();
subject.subscribe(observer);
// observer will receive only onError
BehaviorSubject<Object> subject = BehaviorSubject.create();
subject.onNext("zero");
subject.onNext("one");
subject.onError(new RuntimeException("error"));
subject.subscribe(observer);
上面試官網(wǎng)的一些例子。 從這里可以看到是BehaviorSubject的一些特性。他接受最后一個(gè)
</pre>
重點(diǎn)
completes方法之后,才開(kāi)始接受最后一個(gè)發(fā)送的數(shù)據(jù)
<pre>
AsyncSubject<Integer> source = AsyncSubject.create();
source.subscribe(getFirstObserver()); // it will emit only 4 and onComplete
source.onNext(1);
source.onNext(2);
source.onNext(3);
/*
* it will emit 4 and onComplete for second observer also.
*/
source.subscribe(getSecondObserver());
source.onNext(4);
source.onComplete();
</pre>
4~reduce可以相互轉(zhuǎn)化