最近Retrofit+Rxjava在android網絡請求框架中脫穎而出,受到很多兄弟們的歡迎。在之前公司走的時候一部分網絡框架已經替換成這個,但是由於不是負責的這個模塊,所以只是粗略的瞭解一下,所以現在來進一步的瞭解一下這個框架的應用。
大概看了幾篇博客和一些資料先自我總結一下:
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切換到主線程,執行非耗時性操作!