1. 程式人生 > >Rxjava 2.x筆記(一)

Rxjava 2.x筆記(一)

這麼火的框架,現在才開始學,實在是有點落伍(太落伍)了。因為2.x是獨立於1.x的存在,所以為了儘快趕上時代潮流,本文基於2.x版本,整理一下學習中2.x的知識。因為是做筆記,所以肯定要參考大神的部落格了。(當然,其中的程式碼咱會先敲一遍再貼上的,原來是用筆記本打筆記,當然查詢的時候又不好查,可我喜歡用鋼筆寫字,唉,真是糾結…我想這篇文章的價值就是學習的同時,我會把踩到的坑跟大家說一遍,並儘量找到最優解決方案!)

這裡寫圖片描述

首先,先貼一下大神地址:
[Season_zlc簡書]([https://www.jianshu.com/p/464fa025229e](https://www.jianshu.com/p/464fa025229e))
**一、匯入專案**
    implementation 'io.reactivex.rxjava2:rxjava:2.2.0'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'

二、Rxjava的工作原理:
這裡寫圖片描述
上游,產生事件;下游,接收事件;兩個水管(上下游)通過一定的關係聯絡起來,使得上游每產生一個事件,下游就能接收到事件。
上游和下游分別對應了RxJava中的Observable和Observer。他們之間的連線就對應著subscribe();
Tips:只有當上遊和下游建立連線之後, 上游才會開始傳送事件. 也就是呼叫了subscribe() 方法之後才開始傳送事件.


坑:
這裡寫圖片描述Observable要選第二個,不然會報錯的。。
、、、、、、、、、、、、、、分割線、、、、、、、、、、、、、、、、、、、、
這裡寫圖片描述
如上圖,請在activity裡寫測試程式碼。。。我新建了一個類寫Observable,,結果浪費了將近一個小時。。。
ObservableEmitter&Disposable:
ObservableEmitter:發射器,用於傳送事件,呼叫emitter可以發出三種類型,onNext(T value),onComplete()和onError(Throwable error)。
雖然有三種類型,但也不是你想咋地就咋地的,人尚且得遵守法律,何況小小的發射器呢,咱們看看發射器的“憲法”:
1. 上游可以傳送無限個onNext,下游也可以接受無限個onNext.(咳咳,上來就有點為所欲為了)
2. 當上遊傳送了一個onComplete後,上游onComplete之後的事件將會繼續傳送,而下游收到onComplete事件之後將不再繼續接受事件。(上游是赤裸裸的高富帥特權)
3. 當上遊傳送了一個onError後,上游onError之後的事件將繼續傳送,而下游收到onError事件之後將不再繼續接受事件。(你以為呢,你以為上邊的就一個特權?還是太年輕!)
4. 上游可以不傳送onComplete或onError
5. Most Important!onComplete和onError必須唯一併且互斥,即不能傳送多個onComplete,也不能傳送多個onError,也不能先發一個onComplete,然後再發一個onError,反之亦然(終於有個可以治他的了)
Disposable
:可以瞭解為TT,起阻斷作用,用完一次就扔。。。你懂得,類比上面水管的例子,就相當於兩根管道之間的一個機關,當呼叫它的dispose()方法時,它就會將兩根管道切斷,從而導致下游收不到事件。(看來我這個栗子舉得還不錯)
Tips:上游不會因為傳送了onComplete而停止.下游的onSubscribe()方法是最先呼叫的.

這裡寫圖片描述
如上圖,忘讀者加些log自己跑一下看看,不要像我這麼懶。

subscribe有幾個過載方法:
public final Disposable subscribe() {}
public final Disposable subscribe(Consumer<? super T> onNext) {}
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError) {}
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete) {}
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete, Consumer<? super Disposable> onSubscribe) {}
public final void subscribe(Observer<? super T> observer) {}

**不帶任何引數的subscribe()表示下游不關心任何事件,隨上游隨便作(充滿父愛的眼神 =。=)
**帶有一個Consumer引數的方法表示下游只關心onNext事件,其他的事件都視而不見,如果我們只需要onNext事件,那麼事件就可以寫的更簡單一些了:
這裡寫圖片描述
Ok,明天繼續跟,今天到這,看慕課去嘍~
繼續…
正常情況下,上游下游都是在同一個執行緒中執行的
所以,既然說了正常情況下,那肯定有不正常的情況了;一般咱們用Handler和AsyncTask,其目的不過是讓子執行緒進行耗時操作,讓主頁面只渲染個頁面啥的(很明顯的主僕關係),如果Rxjava連這個也實現不了的話,你覺得要他有何用?所以,來操作一波:
把上游傳送事件的執行緒放到子執行緒中,下游接收還在main中。(子執行緒進行耗時操作)
這裡寫圖片描述

相比上面的用法,這裡很明顯是多了兩行:
.subscribeOn(Schedulers.newThread())
.observerOn(AndroidSchedulers.mainThread())
簡單的說,subscribeOn指定的是上游所線上程,observerOn指定的是下游所線上程
多次指定上游所線上程只有第一次有用,其他的,不過是湊熱鬧罷了,一點用處沒有。
但是多次指定下游所線上程確實每次都行,每指定一次,就切換一次。(此情此景,不像你年輕時愛著的她嗎,無論是更漂亮的,還是更溫柔的,都消減不了你對她的愛,可是後來啊,她走以後…到了年紀,倒覺得無論是誰,都能湊合搭夥過日子了,身邊的人換了一個又一個,可你想想,你的愛情呢,你的唯一呢)
言歸正傳:ex:

Observable.subscribeOn(Schedulers.newThread())
.subscribeOn(Schedulers.newThread())//實際上這話是沒有用的
                   .observeOn(AndroidSchedulers.mainThread())
                   .observeOn(Schedulers.io())
                   .subscribe(consumer);

Rxjava中有一些內定的執行緒型別供我們選擇:
Schedulers.io():代表io操作的執行緒, 通常用於網路,讀寫檔案等io密集型的操作
Schedulers.computation(): 代表CPU計算密集型的操作, 例如需要大量計算的操作
Schedulers.newThread(): 代表一個常規的新執行緒
AndroidSchedulers.mainThread():主執行緒