安卓主流框架鏈接:https://segmentfault.com/a/1190000005073746
本篇筆記參考(復制)該鏈接:
http://blog.csdn.net/github_36617621/article/details/77113175
簡書鏈接:http://www.lxweimin.com/p/464fa025229e
1:要在Android中使用RxJava2, 先添加Gradle配置:
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
2:在開始學習之前,先來介紹點原理性的東西。
網(wǎng)上也有很多介紹RxJava原理的文章,通常這些文章都從觀察者模式開始,先講觀察者,被觀察者,訂閱關系巴拉巴拉一大堆,說實話,當我第一次看到這些文章的時候已經(jīng)被這些名詞給繞暈了,用了很長的時間才理清楚它們之間的關系。可能是我太蠢了,境界不夠,領會不到那么多高大上的名詞.
今天我用兩根水管代替觀察者和被觀察者, 試圖用通俗易懂的話把它們的關系解釋清楚, 在這里我將從事件流這個角度來說明RxJava的基本工作原理。
3------2------1進入 3---2-----1------出
上面一根水管為事件產(chǎn)生的水管,叫它上游吧,下面一根水管為事件接收的水管叫它下游吧。
兩根水管通過一定的方式連接起來,使得上游每產(chǎn)生一個事件,下游就能收到該事件。注意這里和官網(wǎng)的事件圖是反過來的, 這里的事件發(fā)送的順序是先1,后2,后3這樣的順序, 事件接收的順序也是先1,后2,后3的順序, 我覺得這樣更符合我們普通人的思維, 簡單明了.
這里的上游和下游就分別對應著?RxJava?中的?Observable?和?Observer,它們之間的連接就對應著?subscribe(),因此這個關系用?RxJava?來表示就是:
把這段代碼連起來寫就成了RxJava引以為傲的鏈式操作:
接下來解釋一下其中兩個陌生的玩意:?ObservableEmitter?和?Disposable.
ObservableEmitter:?Emitter是發(fā)射器的意思,那就很好猜了,這個就是用來發(fā)出事件的,它可以發(fā)出三種類型的事件,通過調(diào)用emitter的onNext(T value)、onComplete()和onError(Throwable error)就可以分別發(fā)出next事件、complete事件和error事件。
但是,請注意,并不意味著你可以隨意亂七八糟發(fā)射事件,需要滿足一定的規(guī)則:
上游可以發(fā)送無限個onNext, 下游也可以接收無限個?onNext.
當上游發(fā)送了一個?onComplete?后, 上游?onComplete?之后的事件將會繼續(xù)發(fā)送, 而下游收到onComplete事件之后將不再繼續(xù)接收事件.
當上游發(fā)送了一個?onError?后, 上游?onError?之后的事件將繼續(xù)發(fā)送, 而下游收到?onError?事件之后將不再繼續(xù)接收事件.
上游可以不發(fā)送?onComplete?或?onError?.
最為關鍵的是?onComplete?和?onError?必須唯一并且互斥, 即不能發(fā)多個?onComplete?, 也不能發(fā)多個?onError, 也不能先發(fā)一個?onComplete?, 然后再發(fā)一個?onError?, 反之亦然
注: 關于onComplete和onError唯一并且互斥這一點, 是需要自行在代碼中進行控制, 如果你的代碼邏輯中違背了這個規(guī)則,* 并不一定會導致程序崩潰*. 比如發(fā)送多個onComplete是可以正常運行的, 依然是收到第一個onComplete就不再接收了, 但若是發(fā)送多個onError, 則收到第二個onError事件會導致程序會崩潰.
介紹了?ObservableEmitter, 接下來介紹?Disposable, 這個單詞的字面意思是一次性用品,用完即可丟棄的. 那么在?RxJava?中怎么去理解它呢, 對應于上面的水管的例子, 我們可以把它理解成兩根管道之間的一個機關, 當調(diào)用它的?dispose()?方法時, 它就會將兩根管道切斷, 從而導致下游收不到事件.
注意: 調(diào)用dispose()并不會導致上游不再繼續(xù)發(fā)送事件, 上游會繼續(xù)發(fā)送剩余的事件.
來看個例子, 我們讓上游依次發(fā)送1,2,3,complete,4,在下游收到第二個事件之后, 切斷水管, 看看運行結果:
Observable.create(new ObservableOnSubscribe() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void subscribe(ObservableEmitter emitter) throws Exception {
? ? ? ? ? ? ? ? Log.d(TAG, "emit 1");
? ? ? ? ? ? ? ? emitter.onNext(1);
? ? ? ? ? ? ? ? Log.d(TAG, "emit 2");
? ? ? ? ? ? ? ? emitter.onNext(2);
? ? ? ? ? ? ? ? Log.d(TAG, "emit 3");
? ? ? ? ? ? ? ? emitter.onNext(3);
? ? ? ? ? ? ? ? Log.d(TAG, "emit complete");
? ? ? ? ? ? ? ? emitter.onComplete();
? ? ? ? ? ? ? ? Log.d(TAG, "emit 4");
? ? ? ? ? ? ? ? emitter.onNext(4);
? ? ? ? ? ? }
? ? ? ? }).subscribe(new Observer() {
? ? ? ? ? ? private Disposable mDisposable;
? ? ? ? ? ? private int i;
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onSubscribe(Disposable d) {
? ? ? ? ? ? ? ? Log.d(TAG, "subscribe");
? ? ? ? ? ? ? ? mDisposable = d;
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onNext(Integer value) {
? ? ? ? ? ? ? ? Log.d(TAG, "onNext: " + value);
? ? ? ? ? ? ? ? i++;
? ? ? ? ? ? ? ? if (i == 2) {
? ? ? ? ? ? ? ? ? ? Log.d(TAG, "dispose");
? ? ? ? ? ? ? ? ? ? mDisposable.dispose();
? ? ? ? ? ? ? ? ? ? Log.d(TAG, "isDisposed : " + mDisposable.isDisposed());
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onError(Throwable e) {
? ? ? ? ? ? ? ? Log.d(TAG, "error");
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onComplete() {
? ? ? ? ? ? ? ? Log.d(TAG, "complete");
? ? ? ? ? ? }
? ? ? ? });
結果:
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: subscribe
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: emit 1
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: onNext: 1
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: emit 2
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: onNext: 2
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: dispose
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: isDisposed : true
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: emit 3
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: emit complete
12-02 06:54:07.728 7404-7404/zlc.season.rxjava2demo D/TAG: emit 4
從運行結果我們看到, 在收到?onNext2?這個事件后, 切斷了水管, 但是上游仍然發(fā)送了 3, complete, 4這幾個事件, 而且上游并沒有因為發(fā)送了 onComplete 而停止. 同時可以看到下游的onSubscribe() 方法是最先調(diào)用的.
即:
1.調(diào)用dispose()方法上游還會接著走
2.上游不會因為發(fā)送了onComplete而停止
3.下游中onSubscribe()方法是最先調(diào)用的
Disposable?的用處不止這些, 后面講解到了線程的調(diào)度之后, 我們會發(fā)現(xiàn)它的重要性. 隨著后續(xù)深入的講解, 我們會在更多的地方發(fā)現(xiàn)它的身影.
另外,?subscribe()有多個重載的方法:
public final Disposable subscribe() {}
? ? public final Disposable subscribe(Consumer onNext) {}
? ? public final Disposable subscribe(Consumer onNext, Consumer onError) {}
? ? public final Disposable subscribe(Consumer onNext, Consumer onError, Action onComplete) {}
? ? public final Disposable subscribe(Consumer onNext, Consumer onError, Action onComplete, Consumer onSubscribe) {}
? ? public final void subscribe(Observer observer) {}
最后一個帶有Observer參數(shù)的我們已經(jīng)使用過了,這里對其他幾個方法進行說明.
不帶任何參數(shù)的?subscribe()?表示下游不關心任何事件,你上游盡管發(fā)你的數(shù)據(jù)去吧, 老子可不管你發(fā)什么.
帶有一個?Consumer?參數(shù)的方法表示下游只關心onNext事件, 其他的事件我假裝沒看見, 因此我們?nèi)绻恍枰?onNext?事件可以這么寫:
這個系列(一)今天學習了
Observable
Observer
subscribe()?
通常我們使用的是帶(Observer)參數(shù)的subscribe(Observer)方法
不帶任何參數(shù)的subscribe()方法代表上游隨便發(fā),下游收到算我輸
帶有一個Consumer的subscribe(Consumer)方法代表只接收onNext方法
剩下類推
ObservableEmitter
Disposable?
調(diào)用dispose()方法上游還會接著走
上游不會因為發(fā)送了onComplete而停止
下游中onSubscribe()方法是最先調(diào)用的
發(fā)射規(guī)則:?
上游可以發(fā)送無限個onNext, 下游也可以接收無限個?onNext.
當上游發(fā)送了一個?onComplete?后, 上游?onComplete?之后的事件將會繼續(xù)發(fā)送, 而下游收到onComplete事件之后將不再繼續(xù)接收事件.
當上游發(fā)送了一個?onError?后, 上游?onError?之后的事件將繼續(xù)發(fā)送, 而下游收到?onError?事件之后將不再繼續(xù)接收事件.
上游可以不發(fā)送?onComplete?或?onError?.
最為關鍵的是?onComplete?和?onError?必須唯一并且互斥, 即不能發(fā)多個?onComplete?, 也不能發(fā)多個?onError, 也不能先發(fā)一個?onComplete?, 然后再發(fā)一個?onError?, 反之亦然