Rxjava2~Single~CompositeDisposable~PublishSubject(你應(yīng)該懂的)~學(xué)渣帶你扣rxjava2

有幾種模式是你真的想要弄明白的。
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

Paste_Image.png

先說(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.
*/

Paste_Image.png

從這個(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

Paste_Image.png

<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)化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 創(chuàng)建操作 用于創(chuàng)建Observable的操作符Create通過(guò)調(diào)用觀(guān)察者的方法從頭創(chuàng)建一個(gè)ObservableEm...
    rkua閱讀 1,872評(píng)論 0 1
  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位,與響應(yīng)式編程作為結(jié)合使用的,對(duì)什么是操作、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,892評(píng)論 0 10
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,973評(píng)論 19 139
  • 前言 如果你對(duì)RxJava1.x還不是了解,可以參考下面文章。 1. RxJava使用介紹 【視頻教程】2. Rx...
    jdsjlzx閱讀 21,241評(píng)論 3 78
  • 響應(yīng)式編程簡(jiǎn)介 響應(yīng)式編程是一種基于異步數(shù)據(jù)流概念的編程模式。數(shù)據(jù)流就像一條河:它可以被觀(guān)測(cè),被過(guò)濾,被操作,或者...
    說(shuō)碼解字閱讀 3,115評(píng)論 0 5