Rxjava入門:簡單介紹與使用(一)

概述

根據RxJava 在 GitHub 的介紹:

    RxJava:a library for composing asynchronous and event-based programs using observable sequences for the Java VM
	// 翻譯:RxJava 是一個在 Java VM 上使用可觀測的序列來組成異步的、基於事件的程序的庫

RxJava 是一個 基於事件流、實現異步操作的庫,是一種基於觀察者模式的響應式編程框架
RxJava的特點就是可以非常簡便的實現異步調用,類似於Android中的 AsyncTask 、Handler作用;
同時由於 RxJava的使用方式是:基於事件流的鏈式調用,所以使得 RxJava:

  • 邏輯簡潔
  • 實現優雅
  • 使用簡單
    更重要的是,隨着程序邏輯的複雜性提高,它依然能夠保持簡潔 & 優雅

Rxjava原理介紹

Rxjava 基於 一種擴展的觀察者模式
在RxJava中主要有4個角色:

  • 被觀察者(Observable)------產生事件
  • 訂閱(Subscribe)----連接 被觀察者 & 觀察者
  • 觀察者(Observer) -----接收事件,並給出響應動作
  • 事件(Event) ------被觀察者 & 觀察者 溝通的載體

RxJava原理可總結爲:被觀察者 (Observable) 通過 訂閱(Subscribe) 按順序發送事件 給觀察者 (Observer), 觀察者(Observer) 按順序接收事件 & 作出對應的響應動作

原理分析:
一般我們使用RxJava都是編寫類似如下的代碼

Observable.create(new ObservableOnSubscribe()) //創建一個事件流,參數是我們創建的一個事件源
                .map(...)//有時我們會需要使用操作符進行變換
                .subscribeOn(Schedulers.io())//指定事件源代碼執行的線程
                .observeOn(AndroidSchedulers.mainThread())//指定訂閱者代碼執行的線程
                .subscribe(new Observer())//參數是我們創建的一個訂閱者,在這裏與事件流建立訂閱關係

Observable 是RxJava描述的事件流,在鏈式調用中非常清晰,事件從創建到加工處理再到被訂閱者接收到,就是一個接一個的Observable形成的一個事件流。在上面代碼中,每一步方法的調用,都會返回一個新的Observable給下一步,這個是RxJava源碼的基礎。同樣是鏈式調用,但它與常見的Builder模式不太一樣,每個操作符,每次線程切換,每步都會新建一個Observable而非直接加工上一步的Observable返回給下一步。(在源碼中不同的加工會創建不同的Observable,比如map()會創建一個ObservableMap,subscribeOn()會創建一個ObservableSubscribeOn,但它們實際上都是Observable的子類)。

ObservableOnSubscribe 是這個事件流的源頭,稱之爲事件源,一般由自己創建並傳入。創建時,需要重寫其subscribe()方法,爲了和Observable中的subscribe()方法區別,在下面貼出的代碼中將其改名爲call()。在調用鏈中有時會用到各種操作符進行一些變換,事實上每個操作符都會重寫這麼一個call()方法,相對於創建事件源時在這裏寫入的源業務代碼,這些操作符在這裏要做的事是由RxJava欽定的,一般是連接事件流的上下游。在這裏將準備好被訂閱的數據,並調用subscribe()參數中ObservableEmitter的onNext(),onCompleted()或onError()通知訂閱者數據準備情況。

Observer 是整個事件流的訂閱者,也就是說,它將會訂閱前面事件創建,加工以後的最終結果。它也是由我們創建的,並且要重寫它的onNext(),onCompleted(),onError()和onSubscribe(),在接下來的分析中簡化一些,只關注onNext()。創建出了Observer以後,將會使用經過上面所有步驟的最後一步生成的Observable,調用它的subscribe(),與事件源產生聯繫。

使用步驟

  1. 創建被觀察者 (Observable )

  2. 創建觀察者 (Observer )並 定義響應事件的行爲
    Subscribe方法用於將觀察者連接到Observable,你的觀察者需要實現以下方法的一個子集:

    • onNext(T item)
      Observable調用這個方法發射數據,方法的參數就是Observable發射的數據,這個方法可能會被調用多次,取決於你的實現。
    • onError(Exception ex)
      當Observable遇到錯誤或者無法返回期望的數據時會調用這個方法,這個調用會終止Observable,後續不會再調用onNext和onCompleted,onError方法的參數是拋出的異常。
    • onComplete
      正常終止,如果沒有遇到錯誤,Observable在最後一次調用onNext之後調用此方法。

    根據Observable協議的定義,onNext可能會被調用零次或者很多次,最後會有一次onCompleted或onError調用(不會同時),傳遞數據給onNext通常被稱作發射,onCompleted和onError被稱作通知。

  3. 訂閱(Subscribe)連接觀察者和被觀察者

Rxjava的基本實現

  • 使用前先在Android Studio中配置gradle:

dependencies {
    ......
    implementation "io.reactivex.rxjava2:rxjava:2.2.8"
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
}

其中Rxandroid是Rxjava在Android平臺的擴展,它包括了一些能夠簡化Android開發的工具;

  • 創建一個被觀察者Observable:
        //1. 創建一個Observable  可被觀察者
        Observable observable = Observable.create(new ObservableOnSubscribe<String>() {

            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                //在訂閱觸發時發送了發送了兩條數據
                if(!emitter.isDisposed()){
                    emitter.onNext("hello rxjava2");
                    emitter.onNext("小夥伴們,你們好");
                }
                emitter.onComplete();
            }
        });
  • 創建一個觀察者Observer:
        //2.創建一個觀察者
        Observer<String> Observer = new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.i("Eric","onSubscribe: " + d);
            }

            @Override
            public void onNext(String d) {
                Log.i("Eric","onNext: " + d);
            }

            @Override
            public void onError(Throwable e) {
                Log.i("Eric","onError: " + e.getMessage() );
            }

            @Override
            public void onComplete() {
                Log.i("Eric","onComplete: ");
            }
        };
  • observer(觀察者) 訂閱 observable(被觀察者)
        //observer(觀察者) 訂閱 observable(被觀察者)
        observable.subscribe(Observer);
  • 查看輸出
com.eric.rxjavademo I/Eric: onSubscribe: CreateEmitter{null}
com.eric.rxjavademo I/Eric: onNext: 發射一條消息:
com.eric.rxjavademo I/Eric: onNext: 你好!Rxjava
com.eric.rxjavademo I/Eric: onComplete:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章