1. 程式人生 > >Retrofit 2.0使用詳解,配合OkHttp、Gson,Android最強網路請求框架

Retrofit 2.0使用詳解,配合OkHttp、Gson,Android最強網路請求框架

1.使用retrofit,需要下載一些jar包

2.介紹這些jar包的作用

  • 在1.x版本的retrofit框架:

只需要Retrofit包和gson-2.4.jar包就行了,那時的Retrofit預設是使用okhttp jar包來網路請求的,沒有的話就使用自己所帶的網路請求,解析預設是gson解析的,所以我們需要新增gson包。但是如果你要使用okhttp來請求的話,必須要新增okhttp-2.5.0.jar、okio-1.6.0.jar、okhttp-urlconnection-2.5.0.jar這三個包。
(1) okhttp-2.5.0.jar:okhttp主要的網路請求程式碼都在裡面
(2) okio-1.6.0.jar:okhttp 所需要的依賴包
(3) okhttp-urlconnection-2.5.0.jar:連線okhttp和retrofit的橋樑,但是在retrofit2.0後,可以不新增這個包,也可以使用okhttp請求了。

  • 在2.0版本的retrofit框架:
    我現在所用的是retrofit-2.0.0-beta2.jar ,目前的最新版本。發現retrofit改變的挺大。
    (1)retrofit必須使用okhttp請求了,如果專案中沒有okhttp的依賴的話,肯定會出錯
    (2)請求返回的解析不是預設的Gson解析了,需要我們手動去指定。
        Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://apis.baidu.com/showapi_open_bus/showapi_joke/")
            .addConverterFactory
(GsonConverterFactory.create()) .build();

這個就是Gson解析了,GsonConverterFactory是需要下載的jar。這是官方原話:
這裡寫圖片描述
加上converter-gson-2.0.0-beta2_.jar包之後,還是需要gson-2.4.jar這個包的,沒有的話還是解析不了的
(3)okhttp-urlconnection-2.5.0.jar,我發現在retrofit2.0之後不加也是可以的,但是奇怪的是square公司還是一直在更新這個jar(最新是2015.09)。httpmime-4.5.jar是Apache公司的,用來加快網路請求效率的,搜了網上的一些文章,說這2個jar是用來讓網路更快的,我水平有限,深入不了retrofit和okhttp的原始碼理解,各位加上還是不加都是可以請求的,隨意啦~

3.Retrofit的請求

還是和以前一樣,通過介面的對映來請求,但是更改了一些請求方式。
以前是:

        RestAdapter retrofit = new RestAdapter.Builder()
            .setEndpoint(請求地址)
            .setLogLevel(LogLevel.FULL)
//          .setConverter(new GsonConverter(new Gson()))
//          .setClient(new OkClient(new OkHttpClient()))
//          .setErrorHandler(new RetrofitErrorHandler())
//          .setRequestInterceptor(requestInterceptor)
            .build();
        GitHubService service = retrofit.create(GitHubService.class);
        返回實體 result = service.請求的介面名稱(請求引數);

現在是:

        Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(請求地址)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
        GitHubService service = retrofit.create(GitHubService.class);
        retrofit.Call<返回實體> repos = service.請求的介面名稱(請求引數);
        repos.enqueue(new retrofit.Callback<返回實體>() {

            @Override
            public void onResponse(retrofit.Response<返回實體> response, Retrofit retrofit) {
                返回實體 body = response.body();
                LogUtil.i(TAG, body.toString());

            }

            @Override
            public void onFailure(Throwable throwable) {
                // TODO Auto-generated method stub

            }
        });

4.刪除一些類

(1)RequestInterceptor類
2.0中retrofit的請求攔截類被刪除了,現在直接用的okhttp的請求攔截類

OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Response response = chain.proceed(chain.request());
        // Do anything with response here
        return response;
    }
});
// 然後傳遞建立的client到Retrofit的Builder鏈中。
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(請求地址)
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build();

(2)刪除ErrorHandler介面和RetrofitError類
沒有錯誤的提示了,同意集中在 callback的onFailure(Throwable throwable)的異常錯誤中了。

5.同步請求和非同步請求方式改變

以前是:

//在介面對映中
public interface GitHubService{
    //同步請求  
    @POST("joke_text")
    返回實體 請求介面名稱(請求引數);

  //非同步請求
   @POST("joke_text")
   void 請求介面名稱(Callback<返回實體> cb);
}

2.0現在是:

    // 同步請求
    Call<返回實體> call = service.請求介面名稱();
    返回實體 repo = call.execute();

    // 非同步請求
    Call<返回實體> call = service.請求介面名稱();
    call.enqueue(new Callback<返回實體>() {
        @Override
        public void onResponse(Response<返回實體> response, Retrofit retrofit) {
            // Get result bean from response.body()
        }

        @Override
        public void onFailure(Throwable t) {

        }
    });

6.Url的重新定義

7.總結

搞了這麼多,終於可以使用retrofit+okhttp+gson超級網路請求框架了,網上說目前這個是最快的網路請求,比google的volley還快點,至於真假,就不知道了,但是不可否認,確實挺好用的,效率也是槓槓的。
就單獨的來說,OkHttp的網路請求也是很好用的,推薦文章鴻神的http://blog.csdn.net/lmj623565791/article/details/47911083
可惜單獨的Retrofit不能網路請求了,感覺這是2.0最不爽的地方了。當然組合使用應該是更爽的吧。