RxJava:RxJava 在 GitHub 主頁上的自我介紹是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一個在 Java VM 上使用可觀測的序列來組成異步的、基於事件的程序的庫)。這就是 RxJava ,歸納得很是精準。總之就是讓異步操做變得很是簡單。數據庫
各自的職責:Retrofit 負責請求的數據和請求的結果,使用接口的方式呈現,OkHttp 負責請求的過程,RxJava 負責異步,各類線程之間的切換。網絡
說明:使用POST 請求方式時,只須要更改方法定義的標籤,用@POST 標籤,參數標籤用 @Field 或者@Body或者FieldMap,注意:使用POST 方式時注意2點,1,必須加上 @FormUrlEncoded標籤,不然會拋異常。2,使用POST方式時,必需要有參數,不然會拋異常,異步
添加自定義的header(token)async
Retrofit提供了兩個方式定義Http請求頭參數:靜態方法和動態方法,靜態方法不能隨不一樣的請求進行變化,頭部信息在初始化(retrofit)的時候就固定了。而動態方法則必須爲每一個請求都要單獨設置。ide
配合RxJava 使,更改定義的接口,返回值再也不是一個Call ,而是返回的一個Observble.post
RxJava 的這個實現,代碼變多了,可是是一條從上到下的鏈式調用,沒有任何嵌套,這在邏輯的簡潔性上是具備優點的。當需求變得複雜時,這種優點將更加明顯性能
RxJava 的觀察者模式線程
https://link.jianshu.com/?t=http://gank.io/post/560e15be2dca930e00da1083code
RxJava 有四個基本概念:Observable
(可觀察者,即被觀察者)、 Observer
(觀察者)、 subscribe
(訂閱)、事件。Observable
和 Observer
經過 subscribe()
方法實現訂閱關係,從而 Observable
能夠在須要的時候發出事件來通知 Observer
。orm
與傳統觀察者模式不一樣, RxJava 的事件回調方法除了普通事件 onNext()
(至關於 onClick()
/ onEvent()
)以外,還定義了兩個特殊的事件:onCompleted()
和 onError()
。
onCompleted()
: 事件隊列完結。RxJava 不只把每一個事件單獨處理,還會把它們看作一個隊列。RxJava 規定,當不會再有新的 onNext()
發出時,須要觸發 onCompleted()
方法做爲標誌。onError()
: 事件隊列異常。在事件處理過程當中出異常時,onError()
會被觸發,同時隊列自動終止,不容許再有事件發出。onCompleted()
和 onError()
有且只有一個,而且是事件序列中的最後一個。須要注意的是,onCompleted()
和 onError()
兩者也是互斥的,即在隊列中調用了其中一個,就不該該再調用另外一個。1) Scheduler 的 API (一)
在RxJava 中,Scheduler
——調度器,至關於線程控制器,RxJava 經過它來指定每一段代碼應該運行在什麼樣的線程。RxJava 已經內置了幾個 Scheduler
,它們已經適合大多數的使用場景:
Schedulers.immediate()
: 直接在當前線程運行,至關於不指定線程。這是默認的 Scheduler
。Schedulers.newThread()
: 老是啓用新線程,並在新線程執行操做。Schedulers.io()
: I/O 操做(讀寫文件、讀寫數據庫、網絡信息交互等)所使用的 Scheduler
。行爲模式和 newThread()
差很少,區別在於 io()
的內部實現是是用一個無數量上限的線程池,能夠重用空閒的線程,所以多數狀況下 io()
比 newThread()
更有效率。不要把計算工做放在 io()
中,能夠避免建立沒必要要的線程。Schedulers.computation()
: 計算所使用的 Scheduler
。這個計算指的是 CPU 密集型計算,即不會被 I/O 等操做限制性能的操做,例如圖形的計算。這個 Scheduler
使用的固定的線程池,大小爲 CPU 核數。不要把 I/O 操做放在 computation()
中,不然 I/O 操做的等待時間會浪費 CPU。AndroidSchedulers.mainThread()
,它指定的操做將在 Android 主線程運行這裏出現了一個叫作 Func1
的類。它和 Action1
很是類似,也是 RxJava 的一個接口,用於包裝含有一個參數的方法。 Func1
和 Action
的區別在於, Func1
包裝的是有返回值的方法。另外,和 ActionX
同樣, FuncX
也有多個,用於不一樣參數個數的方法。FuncX
和 ActionX
的區別在 FuncX
包裝的是有返回值的方法。
image.png
性能問題解決,但……這代碼實在是太亂了,迷之縮進啊!雜亂的代碼每每不只僅是美觀問題,由於代碼越亂每每就越難讀懂,而若是項目中充斥着雜亂的代碼,無疑會下降代碼的可讀性,形成團隊開發效率的下降和出錯率的升高。
這時候,若是用 RxJava 的形式,就好辦多了。 RxJava 形式的代碼是這樣的:
getUser(userId) .doOnNext(new Action1<User>() { @Override public void call(User user) { processUser(user); }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<User>() { @Override public void onNext(User user) { userView.setUser(user); } @Override public void onCompleted() { } @Override public void onError(Throwable error) { // Error handling ... } });
後臺代碼和前臺代碼全都寫在一條鏈中,明顯清晰了不少。
先請求token,再根據獲取的token請求數據
而使用 RxJava 的話,代碼是這樣的:
@GET("/token") public Observable<String> getToken(); @GET("/user") public Observable<User> getUser(@Query("token") String token, @Query("userId") String userId); getToken() .flatMap(new Func1<String, Observable<User>>() { @Override public Observable<User> onNext(String token) { return getUser(token, userId); }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<User>() { @Override public void onNext(User user) { userView.setUser(user); } @Override public void onCompleted() { } @Override public void onError(Throwable error) { // Error handling ... } });