1. 程式人生 > >Android okHttp網路請求之Retrofit+Okhttp+RxJava組合

Android okHttp網路請求之Retrofit+Okhttp+RxJava組合

前言:

    通過上面的學習,我們不難發現單純使用okHttp來作為網路庫還是多多少少有那麼一點點不太方便,而且還需自己來管理介面,對於介面的使用的是哪種請求方式也不能一目瞭然,出於這個目的接下來學習一下Retrofit+Okhttp的搭配使用。

     okHttp相關文章地址:

Retrofit介紹:

  Retrofit和okHttp師出同門,也是Square的開源庫,它是一個型別安全的網路請求庫,Retrofit簡化了網路請求流程,基於OkHtttp做了封裝,解耦的更徹底:比方說通過註解來配置請求引數,通過工廠來生成CallAdapter,Converter,你可以使用不同的請求介面卡(CallAdapter), 比方說RxJava,Java8, Guava。你可以使用不同的反序列化工具(Converter),比方說json, protobuff, xml, moshi等等。

  • 官網 http://square.github.io/retrofit/
  • github https://github.com/square/retrofit

Retrofit+OkHttpClient使用:

1.)在build.gradle中新增如下配置
compile 'com.squareup.retrofit2:retrofit:2.1.0'
2.)初始化Retrofit
     retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(FastJsonConverterFactory.create())
                .client(mOkHttpClient)
                .build();
3.)初始化OkHttpClient
        OkHttpClient.Builder builder = new OkHttpClient().newBuilder()
                .connectTimeout(10, TimeUnit.SECONDS)//設定超時時間
                .readTimeout(10, TimeUnit.SECONDS)//設定讀取超時時間
                .writeTimeout(10, TimeUnit.SECONDS);//設定寫入超時時間
        int cacheSize = 10 * 1024 * 1024; //
10 MiB Cache cache = new Cache(App.getContext().getCacheDir(), cacheSize); builder.cache(cache); builder.addInterceptor(interceptor); mOkHttpClient = builder.build();

關於okHttp的攔截器、Cache-Control等這裡就不再做解說了

4.)關於ConverterFactory

對於okHttpClient的初始化我們都已經很熟悉了,對ConverterFactory初次接觸多少有點陌生,其實這個就是用來統一解析ResponseBody返回資料的。

常見的ConverterFactory

  • Gsoncom.squareup.retrofit2:converter-gson
  • Jacksoncom.squareup.retrofit2:converter-jackson
  • Moshicom.squareup.retrofit2:converter-moshi
  • Protobufcom.squareup.retrofit2:converter-protobuf
  • Wirecom.squareup.retrofit2:converter-wire
  • Simple XMLcom.squareup.retrofit2:converter-simplexml
  • Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars

    由於專案中使用的是FastJson,所以只能自己自定義ConverterFactory,不過國內已經有大神對此作了封裝(http://www.tuicool.com/articles/j6rmyi7)。

  • FastJson compile 'org.ligboy.retrofit2:converter-fastjson-android:2.0.2'
5.)定義介面 get 請求

     1.get請求 不帶任何引數

public interface IApi {

    @GET("users")//不帶引數get請求
    Call<List<User>> getUsers();

}

   2.get請求 動態路徑 @Path使用

public interface IApi {

   @GET("users/{groupId}")//動態路徑get請求
   Call<List<User>> getUsers(@Path("userId") String userId);

}

  3.get請求 拼接引數 @Query使用

public interface IApi {

    @GET("users/{groupId}")
    Call<List<User>> getUsers(@Path("userId") String userId, @Query("age")int age);

}

  3.get請求 拼接引數 @QueryMap使用

public interface IApi {

    @GET("users/{groupId}")
    Call<List<User>> getUsers(@Path("userId") String userId, @QueryMap HashMap<String, String> paramsMap);

}
6.)定義介面 post請求

   1.post請求 @body使用

public interface IApi {

    @POST("add")//直接把物件通過ConverterFactory轉化成對應的引數
    Call<List<User>> addUser(@Body User user);

}

   2.post請求 @FormUrlEncoded,@Field使用

public interface IApi {

 @POST("login")
    @FormUrlEncoded//讀引數進行urlEncoded
    Call<User> login(@Field("userId") String username, @Field("password") String password);

}

  3.post請求 @FormUrlEncoded,@FieldMap使用

public interface IApi {

    @POST("login")
    @FormUrlEncoded//讀引數進行urlEncoded
    Call<User> login(@FieldMap  HashMap<String, String> paramsMap);

}

  4.post請求 @Multipart,@Part使用

public interface IApi {

    @Multipart
    @POST("login")
    Call<User> login(@Part("userId") String userId, @Part("password") String password);

}
7.)Cache-Control快取控制
public interface IApi {

    @Headers("Cache-Control: max-age=640000")
    @GET("users")//不帶引數get請求
    Call<List<User>> getUsers();

}
8.)請求使用

  1.返回IApi 

    /**
     * 初始化Api
     */
    private void initIApi() {
        iApi = retrofit.create(IApi.class);
    }

    /**
     * 返回Api
     */
    public static IApi api() {

        return api.iApi;
    }

  2.傳送請求

    Call<String> call = Api.api().login(userId,password);
    call.enqueue(new Callback<String>() {
    @Override
    public void onResponse(Call<String> call, Response<String> response) {
        Log.e("", "response---->" + response.body());
    }

    @Override
    public void onFailure(Call<String> call, Throwable t) {
        Log.e("", "response----失敗");
    }
    });

Retrofit+RxJava使用:

  上面介紹了Retrofit 與OkHttp的結合,下面介紹一下Retrofit與RxJava的結合,RxJava作為當前的開源庫的網紅之一,Retrofit理所當然也提供了對其的支援,RxJava的強大之處強大的非同步處理能力,Retrofit與RxJava的結合勢必提高開發效率以及執行效能。

1.)在原來的基礎上新增以下依賴

 compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1' // Retrofit的rx解析庫
 compile 'io.reactivex:rxandroid:1.2.0'
 compile 'io.reactivex:rxjava:1.1.5'

2.)建立retrofit物件例項時,通過addCallAdapterFactory來新增對RxJava的支援

  /**
     * 初始化Retrofit
     */
    private void initRetrofit() {
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(FastJsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(mOkHttpClient)
                .build();
    }

3.)定義請求介面

public interface IApi {

    @POST("system/login")
    Observable<String> systemLogin(@Body String userId, @Body String password);
}

4.)呼叫傳送請求

Api.api().systemLogin(userId,password)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Subscriber<String>() {
        @Override
        public void onCompleted() {
        }

        @Override
        public void onError(Throwable e) {
        }

        @Override
        public void onNext(String result) {

        }
    });

總結:

  這裡簡單介紹了Retrofit與Okhttp、RxJava的結合使用。

相關推薦

Android okHttp網路請求Retrofit+Okhttp+RxJava組合

前言:     通過上面的學習,我們不難發現單純使用okHttp來作為網路庫還是多多少少有那麼一點點不太方便,而且還需自己來管理介面,對於介面的使用的是哪種請求方式也不能一目瞭然,出於這個目的接下來學習一下Retrofit+Okhttp的搭配使用。      okHttp相關文章地址: Retrof

Android 網路開發(一) okHttp網路請求快取控制Cache-Control

Cache-Control: Cache-Control指定請求和響應遵循的快取機制。在請求訊息或響應訊息中設定Cache-Control並不會修改另一個訊息處理過程中的快取處理過程。請求時的快取指令有下幾種: Public指示響應可被任何快取區快取。 Private指示對於單個

Android okHttp網路請求快取控制Cache-Control

前言:     前面的學習基本上已經可以完成開發需求了,但是在專案中有時會遇到對請求做個快取,當沒網路的時候優先載入本地快取,基於這個需求我們來學習一直okHttp的Cache-Control。      okHttp相關文章地址: Cache-Control:      Cache-Contro

Android okHttp網路請求檔案上傳下載

前言:    前面介紹了基於okHttp的get、post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天來實現一下基於okHttp的檔案上傳、下載。      okHttp相關文章地址: 檔案上傳: 1.)不帶引數上傳檔案

Android okHttp網路請求Get/Post請求

   前言:       之前專案中一直使用的Xutils開源框架,從xutils 2.1.5版本使用到最近的xutils 3.0,使用起來也是蠻方便的,只不過最近想著完善一下app中使用的開源框架,由於Xutils裡面包含的東西相對來說比較雜,有資料庫、圖片快取、註解、網路請求等等,秉著一個開源庫只處理一

Android okHttp網路請求Json解析

  前言:   前面兩篇文章介紹了基於okHttp的post、get請求,以及檔案的上傳下載,今天主要介紹一下如何和Json解析一起使用?如何才能提高開發效率?      okHttp相關文章地址:  關於Json解析:   本文的Json解析採用阿里巴巴的FastJson 解析,也可以採用Gso

Android網路請求OkHttp框架

首先宣告許可權 <uses-permission android:name="android.permission.INTERNET"/> 在build.gradle中加入 compile 'com.squareup.okhttp:okhttp:2.4.0' compile

Android網路請求三方庫OkHttp,Retrofit的使用,及其註解使用的簡介

工作內容: 1.OkHttp的Post,Get請求 2.Retrofit的使用【更多詳情可以參考】 學習分享:[程式碼中使用了ButterKnife,參考ButterKnife使用] 1.OkHttp的使用步驟【注意同步載入最好放入子執行緒中:同步載入call.execut

Android----------OkHttp網路請求框架Get和Post簡單封裝(泛型)

請求框架的類: OkHttp依賴: compile 'com.squareup.okhttp3:okhttp:3.8.1' RecyclerView依賴: compile 'com.android.support:recyclerview-v7:26.0.0-alpha1

AndroidOkHttp 網路請求框架的學習封裝

自述:在此以前,自己從來沒有寫過部落格,今天是第一次寫,真心是有點小激動,正要下筆卻不知道應該從何說起,若是寫的不好,請各位見諒吧!關於網路請求,我自認為自己是一個菜鳥,沒有任何經驗,之前做的專案都是別人封裝好,告訴我怎麼呼叫就好了。至於怎麼封裝邏輯的,真是一竅不通,可近來

Android常用網路請求框架xUtils、OkHttp、Volley、Retorfit對比

網路請求框架總結1.xutils     此框架龐大而周全,這個框架可以網路請求,同時可以圖片載入,又可以資料儲存,又可以 View 註解,使用這種框架很方便,這樣會使得你整個專案對它依賴性太強,萬一以後這個庫不維護了,或者中間某個模組出問題了,這個影響非常大,所以在專案開發時,一般會更喜歡選擇專注某一領域

Android網路請求框架Retrofit使用介紹

前言 在android開發中,網路請求是最常用的操作之一,目前熱門的網路請求框架有:Retrofit、volley、okhttp、Android-Async-Http,這裡公司專案中用到Retrofit,之前沒了解過,這裡做個學習記錄。 本文參考博文:這是一份很詳細的 Retrofit 2.

OkHttp網路請求

build.gradle裡新增 implementation 'com.squareup.okhttp3:okhttp:3.4.2' .activity private GridAdapter mGridAdapter; //獲得九宮格資料 okhttpnet2 = new o

Fragment標籤頁+OKHttp網路請求資料+MVP模式

分包方式 需要的第三方依賴 Fragment 新建兩個fragment MainActivity 主頁面佈局 設定Fragment+tablayout的介面卡 Fragment標籤頁結束 OKHttp網路請求 okhttputils工具類

列印完整的okhttp網路請求和響應訊息

背景 開發中,有時需要核對介面請求和響應引數,需要看到詳細的介面呼叫。本來可以通過Facebook Stetho來監控介面的,但是受限於網路,導致調測介面打不開,所以只要尋求其他方案。 解決方案 通過okhttp新增攔截器,列印介面呼叫日誌。 新增依賴 imple

Okhttp網路請求最佳實踐(一)

首先是實現網路的配置:  先獲取網路許可權;  再宣告兩個變數,有關網路操作許可權的; 宣告一個url地址。 public class constants { private static final int WRITE_READ_EXTERNASL_CODE=

okhttp網路請求(基礎)

**加依賴:implementation 'com.squareup.okhttp3:okhttp:3.12.0'** kage com.gj.logindemo.http; import java.io.File; import java.io.IOException; import

Okhttp網路請求+Recyclerview展示資料

首先匯入依賴 //Recyclerview是listview的升級版 implementation 'com.android.support:recyclerview-v7:28.0.0' //okhttp impleme

主流mwp框架+OKHttp網路請求xRecycleView展示

MainActivity package com.zjh.administrat.recyclerviewdemo3.view; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; imp

OkHttp網路請求資料

OkHttpUtils package com.bawei.mymvp.okHttp; import android.os.Handler; import android.os.Looper; import com.bawei.mymvp.Constants; import com.