/**
* 參考自 碼個(gè)蛋 http://chuansong.me/n/1875207353935
* 上游和下游就分別對(duì)應(yīng)著RxJava中的Observable和Observer,它們之間的連接就對(duì)應(yīng)著subscribe()
* 知識(shí)點(diǎn)一:
* 一,上游可以發(fā)送無(wú)限個(gè)onNext, 下游也可以接收無(wú)限個(gè)onNext.
* 二,當(dāng)上游發(fā)送了一個(gè)onComplete后, 上游onComplete之后的事件將會(huì)繼續(xù)發(fā)送, 而下游收到onComplete事件之后將不再繼續(xù)接收事件.
* 三,當(dāng)上游發(fā)送了一個(gè)onError后, 上游onError之后的事件將繼續(xù)發(fā)送, 而下游收到onError事件之后將不再繼續(xù)接收事件.
* 四,上游可以不發(fā)送onComplete或onError.
* 五,最為關(guān)鍵的是onComplete和onError必須唯一并且互斥, 即不能發(fā)多個(gè)onComplete, 也不能發(fā)多個(gè)onError, 也不能先發(fā)一個(gè)onComplete, 然后再發(fā)一個(gè)onError, 反之亦然
* 六,調(diào)用順序:先調(diào)用onSubscribe -> subscribe(上游方法) -> onNext -> onComplete或onError
* 知識(shí)點(diǎn)二: 調(diào)用dispose()并不會(huì)導(dǎo)致上游不再繼續(xù)發(fā)送事件, 上游會(huì)繼續(xù)發(fā)送剩余的事件.
* 知識(shí)點(diǎn)三:
* 帶有Observer參數(shù)的我們已經(jīng)使用過(guò)了,這里對(duì)其他幾個(gè)方法進(jìn)行說(shuō)明.
* 一,不帶任何參數(shù)的subscribe() 表示下游不關(guān)心任何事件,你上游盡管發(fā)你的數(shù)據(jù)去吧, 老子可不管你發(fā)什么.
* 二,帶有一個(gè)Consumer參數(shù)的方法表示下游只關(guān)心onNext事件, 其他的事件我假裝沒看見, 因此我們?nèi)绻恍枰猳nNext事件可以這么寫:
*
* 知識(shí)點(diǎn)四:
* 上游和下游是工作在同一個(gè)線程中的, 也就是說(shuō)上游在哪個(gè)線程發(fā)事件, 下游就在哪個(gè)線程接收事件.
* 知識(shí)點(diǎn)五:
* 一,多次指定上游的線程只有第一次指定的有效, 也就是說(shuō)多次調(diào)用subscribeOn() 只有第一次的有效, 其余的會(huì)被忽略.
* 二,多次指定下游的線程是可以的, 也就是說(shuō)*每調(diào)用一次observeOn()* , 下游的線程就會(huì)切換一次.
* 知識(shí)點(diǎn)六:
* Schedulers.io()
* 代表io操作的線程, 通常用于網(wǎng)絡(luò),讀寫文件等io密集型的操作
* Schedulers.computation()
* 代表CPU計(jì)算密集型的操作, 例如需要大量計(jì)算的操作
* Schedulers.newThread()
* 代表一個(gè)常規(guī)的新線程
*
* AndroidSchedulers.mainThread()
* 代表Android的主線程
*
* 知識(shí)點(diǎn)七:
* 那如果有多個(gè)Disposable 該怎么辦呢, RxJava中已經(jīng)內(nèi)置了一個(gè)容器CompositeDisposable,
* 每當(dāng)我們得到一個(gè)Disposable時(shí)就調(diào)用CompositeDisposable.add()將它添加到容器中, 在退出的時(shí)候,
* 調(diào)用CompositeDisposable.clear() 即可切斷所有的水管.
*
* 知識(shí)點(diǎn)八:
* 上游每發(fā)送一個(gè)事件, flatMap都將創(chuàng)建一個(gè)新的水管, 然后發(fā)送轉(zhuǎn)換之后的新的事件, 下游接收到的就是這些新的水管發(fā)送的數(shù)據(jù).
* 這里需要注意的是, flatMap并不保證事件的順序, 也就是圖中所看到的, 并不是事件1就在事件2的前面.
* 如果需要保證順序則需要使用concatMap.
*
* 最終下游收到的事件數(shù)量是和上游中發(fā)送事件最少的那一根水管的事件數(shù)量相同,這個(gè)也很好理解,
* 因?yàn)槭菑拿恳桓芾锶∫粋€(gè)事件來(lái)進(jìn)行合并,
* 最少的那個(gè)肯定就最先取完, 這個(gè)時(shí)候其他的水管盡管還有事件,
* 但是已經(jīng)沒有足夠的事件來(lái)組合了, 因此下游就不會(huì)收到剩余的事件
*
*/
在RxJava2中,數(shù)據(jù)源有兩個(gè)類,一個(gè)Observable,一個(gè)是Flowable,區(qū)別在于Flowable能處理背壓,而Obserable沒有處理背壓的能力。觀察者也有兩個(gè),一個(gè)是Observer,適用于Observable。一個(gè)是Subscriber,適用于Flowable。(上個(gè)版本里Subscriber是實(shí)現(xiàn)了Observer接口的一個(gè)抽象類,這里是兩個(gè)不相關(guān)的接口)