初識RxJava

最近Retrofit+Rxjavaandroid網絡請求框架中脫穎而出,受到很多兄弟們的歡迎。在之前公司走的時候一部分網絡框架已經替換成這個,但是由於不是負責的這個模塊,所以只是粗略的瞭解一下,所以現在來進一步的瞭解一下這個框架的應用。

大概看了幾篇博客和一些資料先自我總結一下:

Rxjava就是所謂的鏈式結構,主要以觀察者模式來開發,可以讓整個業務流程更加清晰,便於代碼的可讀性和可維護性,隨着邏輯複雜,但是結構更加清晰。

下面先來了解一下RxJava基本使用方法

現在gradle文件中添加依賴

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

然後瞭解一下rxjava中的幾個名詞

Observable被觀察者  Observer觀察者   Subscriber訂閱    Observable Observer  通過Subscriber實現訂閱關係

基本用法

1.定義Obervable

		Observable<String > observable = Observable.create(new Observable.OnSubscribe<String>() {

            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("hello world");
                subscriber.onCompleted();
            }
        });

這樣簡單的數據傳遞模式,我們還可以通過以下方式對Observable進行定義

		Observable<String> myObservable = Observable.just("hello world");

		其返回對象也爲Observable,可以大致看下源碼
		public static <T> Observable<T> just(final T value) {

        		return ScalarSynchronousObservable.create(value);
    		}	

2.定義Observe

	Subscriber<String> subscriber = new Subscriber<String>() {

            @Override
            public void onStart() {
            }
            @Override
            public void onCompleted() {
            }
            @Override
            public void onError(Throwable e) {
            }
            @Override
            public void onNext(String s) {
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        };

這裏的Subscriber是對Observe進行了擴展,增加了onStart()方法,它是在事件未發生之前執行,可以用來做一些初始化工作。其他方法和obersve方法使用保持一直

這裏的Observe也可支持不完整的定義Action0 he Actiion1

	Action1<String> onNextAction = new Action1<String>() {

            @Override
            public void call(String s) {
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        };

這裏的Aciotn1只有一個方法call(),只能傳一個參數無返回值。還有類似Action0也只有一個方法call(),但是無參數無返回值;

3.訂閱

observable.subscribe(subscriber);

或者

myObservable.subscribe(onNextAction);


4.map
操作符數據轉化

	Observable.just("hello world").map(new Func1<String, String>() {

            @Override
            public String call(String s) {
                return s+"my heart";
            }
        }).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        });

這裏正是rxjava的強大之處,可以通過map操作符進行轉化,在我們正常的應用過程中我們也可以通過map操作符對數據進行處理,通過這種鏈式結果使我們的整個代碼結果沒有太大的影響,依然美觀

以前我們在處理List數據的時候很多情況下要進行for循環,如果數據結果比較複雜的話,幾個for循環套在一起,可能導致會出現一些不經意的錯誤,而且代碼的可讀性和可維護性都會降低,那麼我們嘗試用Rxjava的操作符來進行數據的處理

		query("helloWorld")

            .flatMap(new Func1<List<String>, Observable<String>>() {
            	@Override
            	public Observable<String> call(List<String> strings) {
                return Observable.from(strings);
            	}
        		})
           	.flatMap(new Func1<String, Observable<String>>() {
            	@Override
            	public Observable<String> call(String s) {
                return getTitle(s);
            	}
        		})
            .filter(new Func1<String, Boolean>() {  //過濾掉不滿足條件的
            	@Override
            	public Boolean call(String s) {
                return s!=null;
            	}
        		})             
            .take(5)     //輸出指定數量的結果
            .doOnNext(new Action1<String>() {
                    @Override
                    public void call(String s) {            //在每次輸出前做一些額外的操作
                        Log.d("MainActivity","輸出前對數據做一些操作");
                    }
                })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
            }
        });

這樣的話可能看起來我們的代碼變多了,但是我們的結果依舊清晰,就算結果數據複雜也不影響我們數據的可讀性。

當然了我寫的這些只是對map操作符的一些簡單使用,更多,更強大的功能我們在後面的學習過程中在進行挖掘。

5線程切換

因爲在andriod開發過程中,主線程中不能進行耗時操作,不然會引起程序crash。當然使用最多的是我們在進行網絡請求的時候,之前會new Runable,或者使 AsynTask但是,就個人使用感覺有點麻煩,後來Volley推出了,用了挺長一段時間,但是相比較而言感覺還是rxjava的這種線程切換方式更加方便。

	Observable.just("hello","sdfsf", "sdfdf", "wrt")

    .subscribeOn(Schedulers.io()) // 指定 subscribe() 發生在 IO 線程
    .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回調發生在主線程
    .subscribe(new Action1<String>() {
        @Override
        public void call(String str) {
            Log.d(tag, "String:" + str);
        }
    });

subscribeOn用來指定io線程執行耗時操作,observeOn切換到主線程,執行非耗時性操作!

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