/**
* 参考自 码个蛋 http://chuansong.me/n/1875207353935
* 上游和下游就分别对应着RxJava中的Observable和Observer,它们之间的连接就对应着subscribe()
* 知识点一:
* 一,上游可以发送无限个onNext, 下游也可以接收无限个onNext.
* 二,当上游发送了一个onComplete后, 上游onComplete之后的事件将会继续发送, 而下游收到onComplete事件之后将不再继续接收事件.
* 三,当上游发送了一个onError后, 上游onError之后的事件将继续发送, 而下游收到onError事件之后将不再继续接收事件.
* 四,上游可以不发送onComplete或onError.
* 五,最为关键的是onComplete和onError必须唯一并且互斥, 即不能发多个onComplete, 也不能发多个onError, 也不能先发一个onComplete, 然后再发一个onError, 反之亦然
* 六,调用顺序:先调用onSubscribe -> subscribe(上游方法) -> onNext -> onComplete或onError
* 知识点二: 调用dispose()并不会导致上游不再继续发送事件, 上游会继续发送剩余的事件.
* 知识点三:
* 带有Observer参数的我们已经使用过了,这里对其他几个方法进行说明.
* 一,不带任何参数的subscribe() 表示下游不关心任何事件,你上游尽管发你的数据去吧, 老子可不管你发什么.
* 二,带有一个Consumer参数的方法表示下游只关心onNext事件, 其他的事件我假装没看见, 因此我们如果只需要onNext事件可以这么写:
*
* 知识点四:
* 上游和下游是工作在同一个线程中的, 也就是说上游在哪个线程发事件, 下游就在哪个线程接收事件.
* 知识点五:
* 一,多次指定上游的线程只有第一次指定的有效, 也就是说多次调用subscribeOn() 只有第一次的有效, 其余的会被忽略.
* 二,多次指定下游的线程是可以的, 也就是说*每调用一次observeOn()* , 下游的线程就会切换一次.
* 知识点六:
* Schedulers.io()
* 代表io操作的线程, 通常用于网络,读写文件等io密集型的操作
* Schedulers.computation()
* 代表CPU计算密集型的操作, 例如需要大量计算的操作
* Schedulers.newThread()
* 代表一个常规的新线程
*
* AndroidSchedulers.mainThread()
* 代表Android的主线程
*
* 知识点七:
* 那如果有多个Disposable 该怎么办呢, RxJava中已经内置了一个容器CompositeDisposable,
* 每当我们得到一个Disposable时就调用CompositeDisposable.add()将它添加到容器中, 在退出的时候,
* 调用CompositeDisposable.clear() 即可切断所有的水管.
*
* 知识点八:
* 上游每发送一个事件, flatMap都将创建一个新的水管, 然后发送转换之后的新的事件, 下游接收到的就是这些新的水管发送的数据.
* 这里需要注意的是, flatMap并不保证事件的顺序, 也就是图中所看到的, 并不是事件1就在事件2的前面.
* 如果需要保证顺序则需要使用concatMap.
*
* 最终下游收到的事件数量是和上游中发送事件最少的那一根水管的事件数量相同,这个也很好理解,
* 因为是从每一根水管里取一个事件来进行合并,
* 最少的那个肯定就最先取完, 这个时候其他的水管尽管还有事件,
* 但是已经没有足够的事件来组合了, 因此下游就不会收到剩余的事件
*
*/
在RxJava2中,数据源有两个类,一个Observable,一个是Flowable,区别在于Flowable能处理背压,而Obserable没有处理背压的能力。观察者也有两个,一个是Observer,适用于Observable。一个是Subscriber,适用于Flowable。(上个版本里Subscriber是实现了Observer接口的一个抽象类,这里是两个不相关的接口)