當前Android 網絡請求最流行的方式,RxJava + Retrofit + okHttp !

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 (訂閱)、事件。ObservableObserver 經過 subscribe() 方法實現訂閱關係,從而 Observable 能夠在須要的時候發出事件來通知 Observerorm

與傳統觀察者模式不一樣, 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。
  • 另外, Android 還有一個專用的 AndroidSchedulers.mainThread(),它指定的操做將在 Android 主線程運行

這裏出現了一個叫作 Func1 的類。它和 Action1 很是類似,也是 RxJava 的一個接口,用於包裝含有一個參數的方法。 Func1Action 的區別在於, Func1 包裝的是有返回值的方法。另外,和 ActionX 同樣, FuncX 也有多個,用於不一樣參數個數的方法。FuncXActionX 的區別在 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
            ...
        }
    });
相關文章
相關標籤/搜索