RxJava(01-介紹與初體驗)

版權聲明:本文爲openXu原創文章【openXu的博客】,未經博主允許不得以任何形式轉載

目錄:

一. 簡介

  ReactiveX是Reactive Extensions的縮寫,一般簡寫爲Rx,最初是LINQ的一個擴展,由微軟的架構師Erik Meijer領導的團隊開發,在2012年11月開源,Rx是一個編程模型,目標是提供一致的編程接口,幫助開發者更方便的處理異步數據流,Rx近幾年越來越流行了,現在已經支持幾乎全部的流行編程語言了,Rx的大部分語言庫由ReactiveX這個組織負責維護,比較流行的有RxJava/RxJS/Rx.NET。

  Rx是一個使用可觀察數據流進行異步編程的編程接口,ReactiveX結合了觀察者模式、迭代器模式和函數式編程的精華。Rx是一個函數庫,讓開發者可以利用可觀察序列和LINQ風格查詢操作符來編寫異步和基於事件的程序,使用Rx,開發者可以用Observables表示異步數據流,用LINQ操作符查詢異步數據流, 用Schedulers參數化異步數據流的併發處理。

  RxJava最核心的兩個東西是Observables(被觀察者,事件源)和Subscribers(觀察者)。Observables發出一系列事件,Subscribers處理這些事件。這裏的事件可以是任何你感興趣的東西(觸摸事件,web接口調用返回的數據)

  一個Observable可以發出零個或者多個事件,直到結束或者出錯。每發出一個事件,就會調用它的Subscriber的onNext方法,最後調用Subscriber.onNext()或者Subscriber.onError()結束。

  Rxjava的看起來很想設計模式中的觀察者模式,但是有一點明顯不同,那就是如果一個Observerble沒有任何的的Subscriber,那麼這個Observable是不會發出任何事件的。

二. 簡單使用

  Rx是一種編程模型,幫助開發者更方便的處理異步任務,Rx庫現在已經支持幾乎全部的主流編程語言了,並且它提供一致的編程接口。接下來的學習以Android平臺爲例,首先我們要導入依賴庫:

compile 'io.reactivex:rxandroid:1.2.0'
compile 'io.reactivex:rxjava:1.1.5'

RxJava和RxAndroid的GitHub地址如下:
https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid

1. 初步探索

private void showToast(String s){
    Toast.makeText(mContext, s, Toast.LENGTH_SHORT).show();
}

/**
 * 初步探索
 */
private void rx_1() {
    //創建一個Observable對象很簡單,直接調用Observable.create即可
    Observable<String> myObservable = Observable.create(
            new Observable.OnSubscribe<String>() {
                @Override
                public void call(Subscriber<? super String> sub) {
                    sub.onNext("Hello, RxAndroid!");
                    sub.onCompleted();
                }
            }
    );
    //創建一個Subscriber來處理Observable對象發出的字符串
    Subscriber<String> mySubscriber = new Subscriber<String>() {
        @Override
        public void onNext(String s) {
            showToast(s);
        }
        @Override
        public void onCompleted() {
        }
        @Override
        public void onError(Throwable e) {
        }
    };

    /*
     * 通過subscribe函數就可以將我們定義的myObservable對象和mySubscriber對象關聯起來;
     * 這樣就完成了subscriber對observable的訂閱
     * 一旦mySubscriber訂閱了myObservable,myObservable就是調用mySubscriber對象的onNext和onComplete方法,mySubscriber就會打印出Hello World
     */
    myObservable.subscribe(mySubscriber);
}

2. 代碼簡化

  RxJava其實提供了很多便捷的函數來幫助我們減少代碼,後面的博客中會詳細的學習這些API。這裏還用到了一點小知識:Android開發中,強烈推薦使用retrolambda這個gradle插件,這樣你就可以在你的代碼中使用lambda了,不瞭解的可以參考博客:http://blog.csdn.net/xmxkf/article/details/51532028

private void rx_2() {
    //①.使用RxJava提供的便捷函數來減少代碼
    //創建Observable對象的代碼可以簡化爲一行
    Observable<String> myObservable = Observable.just("Hello, RxAndroid!");
    //簡化Subscriber:上面的例子中,我們其實並不關心OnComplete和OnError,
    //我們只需要在onNext的時候做一些處理,這時候就可以使用Action1類
    Action1<String> onNextAction = new Action1<String>() {
        @Override
        public void call(String s) {
            showToast(s);
        }
    };
    //subscribe方法有一個重載版本,接受三個Action1類型的參數,分別對應OnNext,OnComplete, OnError函數
    //myObservable.subscribe(onNextAction, onErrorAction, onCompleteAction);
    //這裏我們並不關心onError和onComplete,所以只需要第一個參數就可以
    myObservable.subscribe(onNextAction);

    //②.上面的代碼最終可以寫成這樣
    Observable.just("Hello, RxAndroid!")
            .subscribe(new Action1<String>() {
                @Override
                public void call(String s) {
                    showToast(s);
                }
            });

    //③.使用java8的lambda可以使代碼更簡潔
    //關於Lambda語法可以看看這篇博客:http://blog.csdn.net/xmxkf/article/details/51532028
    Observable.just("Hello, RxAndroid!")
            .subscribe(s -> showToast(s));
}

3. 操作符(Operators)

private void rx_3() {
    /*
     * ①.我想在Hello, RxAndroid!後面加上一段簽名,你可能會想到去修改Observable對象:
     */
    Observable.just("Hello, RxAndroid! -openXu")
            .subscribe(s -> showToast(s));
    /*
     * 如果我的Observable對象被多個Subscriber訂閱,但是我只想在對某個訂閱者做修改呢?
     */
    Observable.just("Hello, RxAndroid!")
            .subscribe(s -> showToast(s + " -openXu"));
    /*
     * ②. 操作符(Operators)
     * 根據響應式函數編程的概念,Subscribers更應該做的事情是“響應”,響應Observable發出的事件,而不是去修改
     * 所以我們應該在某些中間步驟中對"Hello, RxAndroid!"進行變換
     *
     * 操作符就是爲了解決對Observable對象的變換的問題,
     * 操作符用於在Observable和最終的Subscriber之間修改Observable發出的事件。
     * RxJava提供了很多很有用的操作符,比如map操作符,就是用來把把一個事件轉換爲另一個事件的。
     */
    Observable.just("Hello, RxAndroid!")
            .map(new Func1<String, String>() {
                @Override
                public String call(String s) {
                    return s + " -openXu";
                }
            })
            .subscribe(s -> showToast(s));
    //使用lambda可以簡化爲
    Observable.just("Hello, RxAndroid!")
            .map(s -> s + " -openXu")
            .subscribe(s -> showToast(s));

    /*
     * ③. map操作符進階
     * map操作符更有趣的一點是它不必返回Observable對象返回的類型;
     * 你可以使用map操作符返回一個發射新的數據類型的observable對象。
     * 比如上面的例子中,subscriber並不關心返回的字符串,而是想要字符串的hash值
     */
    Observable.just("Hello, RxAndroid!")
            .map(new Func1<String, Integer>() {
                @Override
                public Integer call(String s) {
                    return s.hashCode();
                }
            })
            .subscribe(i -> showToast(Integer.toString(i)));
    //我們初始的Observable返回的是字符串,最終的Subscriber收到的卻是Integer,使用lambda可以進一步簡化代碼
    Observable.just("Hello, RxAndroid!")
            .map(s -> s.hashCode())
            .subscribe(i -> showToast(Integer.toString(i)));
    //Subscriber做的事情越少越好,我們再增加一個map操作符
    Observable.just("Hello, RxAndroid!")
            .map(s -> s.hashCode())
            .map(i -> Integer.toString(i))
            .subscribe(s -> showToast(s));

}

就體驗到這裏,後面一系列博客會帶大家學習RxJava的各種操作符,如果有疑問請留言,對您有幫助請點贊喔~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章