【Android】RxJava的使用(一)基本用法

前言

最近常常看到RxJava這個字眼,也看到不少人在博客中推薦使用RxJava。好奇的我怎麼能錯過,因而Google了一下,說RxJava好用的和說RxJava難用的都有,因而本身也親自嘗試了一下(感受不容易上手)。寫博客記錄下學習的過程,一方面做爲鞏固,另外一方面但願能幫助到初學者。
(第一篇只介紹了RxJava的基本用法,暫時還沒法看出RxJava的優點。切莫着急,隨着慢慢深刻就能體會到RxJava帶來的方便了)java

參考: 給 Android 開發者的 RxJava 詳解
(本文部份內容引用自該博客)

介紹

在GitHub主頁上的介紹:react

a library for composing asynchronous and event-based programs using observable sequences for the Java VM

翻譯過來就是:android

一個在 Java VM 上使用可觀測的序列來組成異步的、基於事件的程序的庫

對於新手們來講這個太抽象了,咱們(我也是新手)須要看到看到一個更加具體的解釋,簡單來講,它就是一個實現異步操做的庫。(仍是不懂?看代碼更實在)異步

優勢

RxJava的好處就在於它的簡潔性,邏輯簡單的時候看不出RxJava的優點,想必你們都知道在調度過程比較複雜的狀況下,異步代碼常常會既難寫也難被讀懂。這時候RxJava的優點就來了,隨着程序邏輯變得愈來愈複雜,它依然可以保持簡潔。async

觀察者模式

首先要先介紹一下觀察者模式(可能比喻的不夠恰當,意思到了就好);ide

  • 觀察者:監視着被觀察者的行爲,當被觀察者某個狀態改變的時候會通知觀察者觀察者會執行對應的操做;
  • 被觀察者:被監視的對象,當某個狀態改變的時候會通知觀察者
  • 訂閱(或註冊):將觀察者被觀察者創建聯繫。

(很亂?來個栗子?)post

這裏舉一個我個經常使用的例子,點擊Button後觸發OnClickListener
中的onClick()事件。在這個事件中他們的角色分別以下:學習

  • 觀察者:OnClickListener;
  • 被觀察者:Button;
  • 訂閱(或註冊):setOnClickListener()。

RxJava

在上面介紹了觀察者模式,這裏也將RxJava中的三個角色進行一下角色分配spa

  • 觀察者:Observer;
  • 被觀察者:Observable;
  • 訂閱(或註冊):subscribe()。
  • 觀察者

Observer 即觀察者,它決定事件觸發的時候將有怎樣的行爲。
RxJava 觀察者的事件回調方法除了普通事件onNext()(至關於onClick()/onEvent())以外,還定義了兩個特殊的事件:onCompleted()和onError()。線程

  • onCompleted(): 事件隊列完結。RxJava 不只把每一個事件單獨處理,還會把它們看作一個隊列。RxJava 規定,當不會再有新的onNext()發出時,須要觸發onCompleted()方法做爲標誌。
  • onError(): 事件隊列異常。在事件處理過程當中出異常時,onError()

會被觸發,同時隊列自動終止,不容許再有事件發出。

  • 在一個正確運行的事件序列中,onCompleted()和onError()有且只有一個,而且是事件序列中的最後一個。須要注意的是,onCompleted()

和onError()兩者也是互斥的,即在隊列中調用了其中一個,就不該該再調用另外一個。

  • 被觀察者

Observable 即被觀察者,它決定何時觸發事件以及觸發怎樣的事件。可使用create()、just(T...)、from(T[])或from(Iterable<? extends T>)來建立一個 Observable ,併爲它定義事件觸發規則。

  • 訂閱

建立了Observable和Observer以後,再用subscribe()方法將它們聯結起來

直接看代碼吧,這裏只展現了RxJava的基本用法,暫時看不出RxJava的優點。

使用

例:打印機個字符串
添加依賴

compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
//建立一個觀察者
        Observer<String> observer = new Observer<String>() {

            @Override
            public void onCompleted() {
                Log.i(TAG, "Completed");
            }

            @Override
            public void onError(Throwable e) {
                Log.i(TAG, "Error");
            }

            @Override
            public void onNext(String s) {
                Log.i(TAG, s);
            }
        };
        //使用Observable.create()建立被觀察者
        Observable observable1 = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("Hello");
                subscriber.onNext("Wrold");
                subscriber.onCompleted();
            }
        });
        //訂閱
        observable1.subscribe(observer);
以上用到的都是rx包裏面的,別用錯了!!!
Observer

上面完成了一次Rxjava的基本使用。

擴展

  • Subscriber

除了Observer接口以外,RxJava 還內置了一個實現了Observer的抽象:Subscriber。Subscriber對Observer接口進行了一些擴展,但他們的基本使用方式是徹底同樣的:

Subscriber<String> subscriber = new Subscriber<String>() {
    @Override
    public void onNext(String s) {
        Log.d(tag, "Item: " + s);
    }

    @Override
    public void onCompleted() {
        Log.d(tag, "Completed!");
    }

    @Override
    public void onError(Throwable e) {
        Log.d(tag, "Error!");
    }
};

不只基本使用方式同樣,實質上,在 RxJava 的 subscribe 過程當中,Observer也老是會先被轉換成一個Subscriber再使用。如圖:
Rxjava源碼
因此若是你只想使用基本功能,選擇Observer和Subscriber是徹底同樣的。它們的區別對於使用者來講主要有兩點:

  • onStart(): 這是Subscriber增長的方法。它會在 subscribe 剛開始,而事件還未發送以前被調用,能夠用於作一些準備工做,例如數據的清零或重置。這是一個可選方法,默認狀況下它的實現爲空。須要注意的是,若是對準備工做的線程有要求(例如彈出一個顯示進度的對話框,這必須在主線程執行),onStart()就不適用了,由於它老是在 subscribe 所發生的線程被調用,而不能指定線程。要在指定的線程來作準備工做,可使用doOnSubscribe()方法,具體能夠在後面的文中看到。
  • unsubscribe(): 這是Subscriber所實現的另外一個接口Subscription

的方法,用於取消訂閱。在這個方法被調用後,Subscriber將再也不接收事件。通常在這個方法調用前,可使用isUnsubscribed()先判斷一下狀態。unsubscribe()這個方法很重要,由於在subscribe()以後,Observable會持有Subscriber的引用,這個引用若是不能及時被釋放,將有內存泄露的風險。因此最好保持一個原則:要在再也不使用的時候儘快在合適的地方(例如onPause()onStop()等方法中)調用unsubscribe()來解除引用關係,以免內存泄露的發生。

  • Observable

Observable的其餘幾種建立方法,一下Observable等價於以前使用Create()建立的Observable:
一、使用Observable.just()建立被觀察者

Observable observable2 = Observable.just("Hello", "World");

二、使用Observable.from()建立被觀察者

String [] words = {"Hello", "World"};
Observable observable3 = Observable.from(words);

List<String> list = new ArrayList<String>();
list.add("Hellow");
list.add("Wrold");
Observable observable4 = Observable.from(list);

小結

目前沒看出RxJava的任何好處,感受代碼還多了~~~
(別急,由於是第一篇,我只介紹了他們之間的關係以及最基礎的用法。後面的幾篇我會介紹RxJava的其餘功能,還有一些複雜的嵌套關係的處理,到時候知道RxJava的強大之處了)

更多:
Android RxJava的使用(二)Action
Android RxJava的使用(三)轉換(map、flatMap)
Android RxJava的使用(四)線程控制 —— Scheduler

以上有錯誤之處感謝指出
相關文章
相關標籤/搜索