1. 程式人生 > >小白學習Rxjava2,從零開始到實戰(一) RxJava2的基礎使用

小白學習Rxjava2,從零開始到實戰(一) RxJava2的基礎使用

前言

RxJava是什麼?
RxJava 在 GitHub 主頁上是這樣說的 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一個在 Java VM 上使用可觀測的序列來組成非同步的、基於事件的程式的庫)。
恩,簡單來說,非同步操作庫。

RxJava的特點?
簡潔。
這裡的簡潔並不是指程式碼長度,而是邏輯上的簡潔。具體的解釋可以看下扔物線大大的部落格,裡面介紹的很詳細:給 Android 開發者的 RxJava 詳解

為什麼選擇RxJava2?

Rxjava 2 vs Rxjava1 ,是否要升級?
總結一下:Rxjava2在背壓問題上做出瞭解決方案,提升了效能,但相應的,部分寫法變得更加複雜。
現階段Rxjava還在維護,使用的話,完全沒有問題;但是,如果你的應用還有較長的使用時間,而且有像感測器那樣一秒連戳幾十下的操作,那最好還是升級到Rxjava2;

小白學習之我見

個人評價:
如果是跟我一樣之前沒搞過Rxjava,那麼感覺還是直接從Rxjava2學起吧,畢竟以後還是要學的,這一刀跑不了。

難度方面:
如果沒有點基礎,剛上來還是有點難度的,畢竟從最直觀的程式碼長度上來看,RxJava沒有太大優勢,而且要想理解其中的原理還是有點難度的;不過只是想學會怎麼用的話,難度還是可以的。(順便吐槽下,好多都是講一遍觀察者,訂閱者,訂閱關係………………,講這麼多名詞,繞都繞暈了,剛上來誰知道訂閱是個什麼東西啊)

正文

匯入Rxjava2

build.gradle中加入

    compile "io.reactivex.rxjava2:rxjava:2.0.7"
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

Rxjava2的簡單使用

最簡單的Rxjava2的使用就像下面這樣:

//建立訂閱者
Subscriber<String> subscriber = new Subscriber<String>() {
    @Override
    public void onSubscribe(Subscription s) {
    //這一步是必須,我們通常可以在這裡做一些初始化操作,呼叫request()方法表示初始化工作已經完成
//呼叫request()方法,會立即觸發onNext()方法 //在onComplete()方法完成,才會再執行request()後邊的程式碼 s.request(Long.MAX_VALUE); } @Override public void onNext(String value) { Log.e("onNext", value); } @Override public void onError(Throwable t) { Log.e("onError", t.getMessage()); } @Override public void onComplete() { //由於Reactive-Streams的相容性,方法onCompleted被重新命名為onComplete Log.e("onComplete", "complete"); } }; Flowable.create(new FlowableOnSubscribe<String>() { @Override public void subscribe(FlowableEmitter<String> e) throws Exception { e.onNext("Hello,I am China!"); } }, BackpressureStrategy.BUFFER) .subscribe(subscriber);

具體分析一下的話,可以這麼想象:
你的Boss現在給你提了個需求:
有兩種盒子,一種名叫Flowable,一種名叫Subscriber,其中Flowable放了很多個小球,現在你要做的事,就是把Flowable中的小球放到Subscriber中,然後讀出來貼在小球上的標籤。

那麼,我們該怎麼做呢?
第一步,首先要挑出這兩個盒子,名為Flowable的盒子就是通過create方法建立,稱之為被觀察者,名為Subscriber的盒子可以直接new出來,稱之為觀察者/訂閱者
第二步,就是要確定,我是要把Flowable中的小球放到哪個Subscriber中,這就是程式碼中的subscribe方法,告訴Flowable,你的小球發到哪個Subscriber盒子中,這個過程就叫做訂閱
第三步,就可以動手把Flowable中的小球拿出來了,拿出小球的過程就是Flowable.create方法中的subscribe

    @Override
    public void subscribe(FlowableEmitter<String> e) throws Exception {
        e.onNext("Hello,I am China!");
    }

在這個方法中,出現了一個FlowableEmitter,這個Emitter就是發射器的意思,可以想象成拿出小球的那隻手;e.onNext("Hello,I am China!");可以理解為,用名為FlowableEmitter的手,拿出一個帶有"Hello,I am China!"標籤的小球。如果你要想再拿出個小球,那就再寫一遍onNext即可;
第四步,好了,拿出小球了,總要放到另一個盒子中吧,這時候就到了Subscriber這個盒子中了。首先,這個盒子跟上個盒子Flowable稍微有點不同,它有一個蓋子:Subscription

    @Override
    public void onSubscribe(Subscription s) {
    //這一步是必須,我們通常可以在這裡做一些初始化操作,呼叫request()方法表示初始化工作已經完成
    //呼叫request()方法,會立即觸發onNext()方法
    //在onComplete()方法完成,才會再執行request()後邊的程式碼
    s.request(Long.MAX_VALUE);
    }

這個蓋子的作用就是控制進入Subscriber中小球的數量和速度的,還記得Rxjava2和Rxjava1的區別之一——背壓問題麼,這塊就是通過這個蓋子來控制解決的;如果,你不想讓小球進入盒子,那麼直接Subscription.cancle(),如果想讓每回只進入10個小球,那就Subscription.request(10);當然,背壓問題不是僅僅這麼就能解決的,具體解決方案在後面會提到。
第五步,ok,小球放進去了,就剩讀標籤這個操作了,讀標籤這個操作就是onNext方法,相應的出錯和完成方法就是onErroronComplete

    @Override
    public void onNext(String value) {
        Log.e("onNext", value);
    }

    @Override
    public void onError(Throwable t) {
        Log.e("onError", t.getMessage());
    }

    @Override
    public void onComplete() {
    //由於Reactive-Streams的相容性,方法onCompleted被重新命名為onComplete
        Log.e("onComplete", "complete");
    }

總結

到這裡,基本的簡單使用,就是這樣,當然用Rxjava2不可能就這麼使用就ok了,非同步操作這一重點會放到下一章來說明。不過現在要學習的是retrofit