一.簡單使用RxJava的三個步驟
? ? 1.創(chuàng)建Observable,也就是我們常說的被觀察者
? ? 2.創(chuàng)建Observer,即觀察者
? ? 3.使用subscribe()進行訂閱
實例
Observable.just("Hello World").subscribe(new Consumer() {? ? @Override? ? public void accept(String s) throws Exception {? ? ? ? System.out.println(s);? ? }});
? 以上實例中 ?Observable.just() 方法創(chuàng)建一個被觀察者, Consumer是消費者,用于接收被觀察者發(fā)送的數(shù)據(jù)
? subscribe的多個重載方法
? ? 1.subscribe(onNext)
? ? 2.subscribe(onNext,onError)
? ? 3.subscribe(onNext,onError,onComplete)
? ? 4.subscribe(onNext,onError,onSubscribe)
onComplete是一個Action,Action和Consumer的區(qū)別是Action沒有參數(shù);在Rxjava中被觀察者鸟廓,觀察者,subscribe()方法三者缺一不可襟己,只有使用了subscribe()引谜,被觀察者才會開始發(fā)送數(shù)據(jù)。
5種常用的被觀察者
二.do操作符
? ?do操作符可以給Observable的生命周期的各個階段加上一系列的回調(diào)監(jiān)聽擎浴。
? 常見的do操作符的解釋:
三.Hot Observable和Cold Observable
? ? Hot Observable無論有沒有觀察者進行訂閱员咽,事件始終都會發(fā)生,當(dāng)有多個訂閱者時贮预,Hot Observable與訂閱者們的關(guān)系是一對多的贝室;Cold Observable是只有觀察者訂閱了,才開始執(zhí)行發(fā)射數(shù)據(jù)流的代碼仿吞,當(dāng)有多個訂閱者時滑频,cold observable與訂閱者們是一對一的關(guān)系;
? ? observable的just唤冈,create峡迷,range,fromXXX等操作符都能生成Cold Observable你虹。
Cold Observable如何轉(zhuǎn)換成Hot Observable绘搞?
? ? 1.使用publish枣申,生成ConnectableObservable
? ? 實例
? ??
? ?ConnectableObservable是線程安全的
2.使用Subject/Processor
? ?實例
? ?上述實例中,Subject既是Observable,又是Observer看杭;Subscject作為觀察者,可以訂閱目標(biāo)Cold Observable挟伙,是對方開始發(fā)送事件楼雹。同時它又可以作為Observable轉(zhuǎn)發(fā)或者發(fā)送新的事件,讓cold Observable借助Subject轉(zhuǎn)換為Hot Observable尖阔;Subject并不是線程安全的贮缅;
Hot Observable如何轉(zhuǎn)換成Cold Observable
??1.使用ConnectableObservable的refCount操作符
? ? 實例:
如果不是所有的訂閱者/觀察者都取消了訂閱,而只是部分取消介却,則部分的訂閱者觀察者重新開始訂閱時谴供,不會從頭開始數(shù)據(jù)流
Observeble的share操作符封裝了publish.refCount()調(diào)用,原來同上齿坷。
四桂肌,另外4種被觀察者Flowable,Single,Completable,Maybe
1.Flowable
? ??????1.RxJava2.x中,Observable不再支持被壓永淌,而改由Flowable來支持非阻塞式的背壓崎场,并且Flowable的所有操作符都強制支持背壓。
? ? ? ? 2.Flowable和Observable使用上的區(qū)別:
? ? ? ? ? ? ? ? ? ? 1.Observable一般處理最大不超過1000條的數(shù)據(jù)遂蛀,而Flowable可以處理以某種方式產(chǎn)生的超過10KB的元素
? ? ? ? ? ? ? ? ? ? 2.Obserbable一般處理GUI鼠標(biāo)事件谭跨,基本不會背壓。而Flowable一遍用于文件的讀取與分析李滴,讀取數(shù)據(jù)庫記錄螃宙,創(chuàng)建網(wǎng)絡(luò)I/O流
? ? ? ? ? ? ? ? ? ? 3.Observable處理同步流,F(xiàn)lowable創(chuàng)建一個響應(yīng)式非阻塞接口
2.Single
? ? ? ? 1.Single只有onSuccess和onError事件所坯,onSuccess能且只能發(fā)送一個數(shù)據(jù)
? ? ? ? 2.Single可以通過toXXX方法轉(zhuǎn)換成Observable谆扎,F(xiàn)lowable,Completable芹助,Maybe
3.Completable
? ? ? ? 1.?Completable只有onComplete和onError事件燕酷,所以Completable在創(chuàng)建后,不會發(fā)射任何數(shù)據(jù)周瞎,并且其所有的操作符也很少
? ? ? ? 2.我們可以通過fromXXX操作符來創(chuàng)建一個Completable
? ??????????Completable.fromAction(new Action() { @Override public void run() throws Exception { System.out.println("Hello world"); }});
? ? ? ? ??3.Completable經(jīng)常結(jié)合andThen操作符使用
4.MayBe
? ? ? ? ?1.MayBe可以看成是Single和Completable的結(jié)合
? ? ? ? ? ?2.MayBe也只能發(fā)射0或者一個數(shù)據(jù)苗缩,即使發(fā)射多個數(shù)據(jù),后面發(fā)射的數(shù)據(jù)也不會再處理
五声诸,Subject和Processor
Subject是一種特殊的存在酱讶,既是Observable,又是Observer彼乌,官網(wǎng)稱可以將Subject看做是一個橋梁或者代理
? ? ?Processor和Subject的作用相同泻肯,Processor能夠支持背壓渊迁,這是Processor和Subject的最大區(qū)別