Retrofit + RxJava + OkHttp 讓網絡請求變的簡單-基礎篇

https://www.jianshu.com/p/5bc866b9cbb9java

最近由於手頭上的工做作完了,比較閒,想着作一些優化。看到之前用的那一套網絡框架添加一個請求比較麻煩,而且比較難用,因此想改造一下網絡框架。如今Android 市面上很火的固然是 Retrofit+RxJava + OkHttp, 功能強大,簡單易用,所以選用這套方案來改造網絡庫。本篇文章是對Retrofit 的基本使用方法作一些簡單的介紹。後面會再寫一篇 Retrofit + RxJava + OkHttp 的封裝過程。如下是正文。react

簡介:

Retrofit: Retrofit是Square 公司開發的一款正對Android 網絡請求的框架。底層基於OkHttp 實現,OkHttp 已經獲得了google 官方的承認。Retrofit官網android

OkHttp: 也是Square 開源的網絡請求庫git

RxJava:RxJava 在 GitHub 主頁上的自我介紹是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一個在 Java VM 上使用可觀測的序列來組成異步的、基於事件的程序的庫)。這就是 RxJava ,歸納得很是精準。總之就是讓異步操做變得很是簡單。github

各自的職責:Retrofit 負責請求的數據和請求的結果,使用接口的方式呈現,OkHttp 負責請求的過程,RxJava 負責異步,各類線程之間的切換。json

RxJava + Retrofit + okHttp 已成爲當前Android 網絡請求最流行的方式。api

一,Retrofit 寫一個網絡請求

以獲取豆瓣 Top250 榜單爲例,地址:https://api.douban.com/v2/movie/緩存

1,首先,要使用Retrofit ,你確定須要把它的包引入,在你的build.gradle文件中添加以下配置:網絡

compile 'com.squareup.retrofit2:retrofit:2.1.0'//retrofit compile 'com.google.code.gson:gson:2.6.2'//Gson 庫 //下面兩個是RxJava 和RxAndroid compile 'io.reactivex:rxjava:1.1.0' compile 'io.reactivex:rxandroid:1.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0'//轉換器,請求結果轉換成Model compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'//配合Rxjava 使用 

2,建立一個Retrofit 實例,而且完成相關的配置框架

public static final String BASE_URL = "https://api.douban.com/v2/movie/"; Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); 

說明:配置了接口的baseUrl和一個converter,GsonConverterFactory 是默認提供的Gson 轉換器,Retrofit 也支持其餘的一些轉換器,詳情請看官網Retrofit官網

3,建立一個 接口 ,代碼以下:

public interface MovieService { //獲取豆瓣Top250 榜單 @GET("top250") Call<MovieSubject> getTop250(@Query("start") int start,@Query("count")int count); } 

說明:定義了一個方法getTop250,使用get請求方式,加上@GET 標籤,標籤後面是這個接口的 尾址top250,完整的地址應該是 baseUrl+尾址 ,參數 使用@Query標籤,若是參數多的話能夠用@QueryMap標籤,接收一個Map

4,用Retrofit 建立 接口實例 MoiveService,而且調用接口中的方法進行網絡請求,代碼以下:

//獲取接口實例 MovieService MovieService movieService = retrofit.create(MovieService.class); //調用方法獲得一個Call Call<MovieSubject> call = movieService.getTop250(0,20); //進行網絡請求 call.enqueue(new Callback<MovieSubject>() { @Override public void onResponse(Call<MovieSubject> call, Response<MovieSubject> response) { mMovieAdapter.setMovies(response.body().subjects); mMovieAdapter.notifyDataSetChanged(); } @Override public void onFailure(Call<MovieSubject> call, Throwable t) { t.printStackTrace(); } }); 

以上是異步方式請求,還有同步方式execute(),返回一個Response,代碼以下:

Response<MovieSubject> response = call.execute();

以上就是用Retrofit 完成了一個網絡請求,獲取豆瓣top250 榜單電影,效果圖以下:

 
84193B9F-BBAE-4967-ADB4-F923A422AD64.png

以上示例是用get方式完成,若是要使用post 方式,咱們只須要修改一下接口中的方法定義,以下:

public interface MovieService { //獲取豆瓣Top250 榜單 @FormUrlEncoded @POST("top250") Call<MovieSubject> getTop250(@Field("start") int start, @Field("count") int count); } 

說明:使用POST 請求方式時,只須要更改方法定義的標籤,用@POST 標籤,參數標籤用 @Field 或者@Body或者FieldMap,注意:使用POST 方式時注意2點,1,必須加上 @FormUrlEncoded標籤,不然會拋異常。2,使用POST方式時,必需要有參數,不然會拋異常, 源碼拋異常的地方以下:

if (isFormEncoded && !gotField) { throw methodError("Form-encoded method must contain at least one @Field."); } 

以上就是一個使用Retrofit 完成一個網絡請求的完整示例,其餘標籤使用方式請看官網Retrofit官網,官網用法也介紹的比較詳細,此外,發現了一篇博客也介紹得比較詳細,Retrofit用法詳解

二,配合RxJava 使用

1, 更改定義的接口,返回值再也不是一個Call ,而是返回的一個Observble.

public interface MovieService { //獲取豆瓣Top250 榜單 @GET("top250") Observable<MovieSubject> getTop250(@Query("start") int start, @Query("count")int count); } 

2,建立Retrofit 的時候添加以下代碼

addCallAdapterFactory(RxJavaCallAdapterFactory.create())

3,添加轉換器Converter(將json 轉爲JavaBean)

addConverterFactory(GsonConverterFactory.create())

4,Activity 或者 Fragment 中傳入 Subscriber 創建訂閱關係

Subscription subscription = movieService.getTop250(0,20) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<MovieSubject>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(MovieSubject movieSubject) { mMovieAdapter.setMovies(movieSubject.subjects); mMovieAdapter.notifyDataSetChanged(); } }); 

以上是加入RxJava 後的網絡請求,返回再也不是一個Call ,而是一個Observable, 在Activity / Fragment 中傳入一個Subscriber 創建訂閱關係,就能夠在 onNext 中處理結果了,RxJava 的好處是幫我處理線程之間的切換,咱們能夠在指定訂閱的在哪一個線程,觀察在哪一個線程。咱們能夠經過操做符進行數據變換。整個過程都是鏈式的,簡化邏輯。其中FlatMap 操做符 還能夠解除多層嵌套的問題。總之,RxJava 很強大,能幫我處理不少複雜的場景,若是熟練使用的話,那麼能提高咱們的開發效率。這裏不打算講RxJava 的內容,若是還不瞭解RxJava ,或者還對RxJava不熟悉的話,推薦幾篇寫很優秀的博客。

1,RxJava 的經典文章,扔物線的 給 Android 開發者的 RxJava 詳解
2,關於RxJava 友好的文章
3,關於RxJava 友好的文章-進階

三,加入 OkHttp 配置

經過OkHttpClient 能夠配置不少東西,好比連接超時時間,緩存,攔截器等等。代碼以下:

// 建立 OKHttpClient OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.connectTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS);//鏈接超時時間 builder.writeTimeout(DEFAULT_TIME_OUT,TimeUnit.SECONDS);//寫操做 超時時間 builder.readTimeout(DEFAULT_TIME_OUT,TimeUnit.SECONDS);//讀操做超時時間 // 添加公共參數攔截器 BasicParamsInterceptor basicParamsInterceptor = new BasicParamsInterceptor.Builder() .addHeaderParam("userName","")//添加公共參數 .addHeaderParam("device","") .build(); builder.addInterceptor(basicParamsInterceptor); // 建立Retrofit mRetrofit = new Retrofit.Builder() .client(builder.build()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .baseUrl(ApiConfig.BASE_URL) .build(); 

以上只是配置了一些簡單的項,如,鏈接超時時間,實際項目中,咱們可能有一些公共的參數,如 ,設備信息,渠道,Token 之類的,每一個接口都須要用,咱們能夠寫一個攔截器,而後配置到OKHttpClient裏,經過 builder.addInterceptor(basicParamsInterceptor) 添加,這樣咱們就不用每一個接口都添加這些參數了。緩存也能夠經過寫一個攔截器來實現(後面文章再講)。

以上就是Retrofit+RxJava+OkHttp實現網絡請求的簡單演示,若是每一個接口都這麼寫的話,代碼量太多,並且不優雅。因此還須要咱們封裝一下,因爲篇幅有限,封裝放到下一篇文章。

** Retrofit + RxJava + OkHttp 封裝已更新,請看Retrofit + RxJava + OkHttp 讓網絡請求變的簡單-封裝篇**

參考博客:
1,Retrofit用法詳解
2,基於Retrofit、OkHttp、Gson封裝通用網絡框架
3, RxJava 與 Retrofit 結合的最佳實踐

做者:依然範特稀西 連接:https://www.jianshu.com/p/5bc866b9cbb9 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索