1. 程式人生 > >OKHttp使用詳解及原始碼解析

OKHttp使用詳解及原始碼解析

前言

上一篇部落格瞭解了Retrofit的使用,它是對OKHttp的封裝,且Retrofit2的內部實現是OKHttp3,下面就瞭解一下OKHttp3的使用!

使用

①首先匯入依賴,最新的版本是3.4.1,在gradle中:

compile 'com.squareup.okhttp3:okhttp:3.4.1'

OKHttp內部依賴Okio庫,所以也要新增Okio庫,最新版本為1.9.0:

compile 'com.squareup.okio:okio:1.9.0'

②傳送HTTP請求
GET請求

//得到OKHttpClient物件
OkHttpClient okHttpClient=new
OkHttpClient(); //得到Request物件 Request request=new Request.Builder() .url("http://api.36wu.com/Weather/GetWeather?district=%E5%8C%97%E4%BA%AC") .build(); //OkhttpClient#newCall()得到Call物件 Call call=okHttpClient.newCall(request); //Call#enqueue()請求網路 call.enqueue(new Callback() { @Override
public void onFailure(Call call, IOException e) { Log.e("fail",e.toString()); } @Override public void onResponse(Call call, Response response) throws IOException{ Log.e("success",response.body().toString()); } }); }

上面註釋已經很清晰了,這裡就不再做解釋了!
這裡需要注意的一點onResponse回撥的引數是response,一般情況下,比如我們希望獲得返回的字串,可以通過response.body().string()獲取;如果希望獲得返回的二進位制位元組陣列,則呼叫response.body().bytes();如果你想拿到返回的inputStream,則呼叫response.body().byteStream()
POST請求

OkHttpClient okHttpClient=new OkHttpClient();
//構建RequestBody物件,呼叫add()方法構建我們的鍵值對
RequestBody body=new FormBody.Builder()
    .add("district","%E5%8C%97%E4%BA%AC")
    .build();
//在構建Request物件時,呼叫post方法,傳入RequestBody物件
Request request=new Request.Builder()
    .url("http://api.36wu.com/Weather/GetWeather")
    .post(body)
    .build();
Call call=okHttpClient.newCall(request);
call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("fail",e.toString());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.e("success",response.body().toString());
            }
        });
    }

這裡需要注意的一點:在OKHttp3中在構建RequestBody物件時,已使用FormBody代替了之前的FormEncodingBuilder,這裡需要注意一下!
③檔案上傳
檔案上傳,在構建RequestBody的時候:

OkHttpClient okHttpClient=new OkHttpClient();
File file = new File(Environment.getExternalStorageDirectory(), "test.txt");
RequestBody body = RequestBody.create(MediaType.parse("application/octet-stream"), file);
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addPart(Header物件,body)
//.addFormDataPart("XXX","XXX",body)
.build();
Request request = new Request.Builder()
    .url("XXXX")
    .post(requestBody)
    .build();

Call call = okHttpClient.newCall(request);
call.enqueue(new Callback(){ });

這裡需要注意的一個問題:OKHttp3中用於檔案上傳的MultipartBody,代替了之前的MultipartBuilder,用法也稍微的不一樣,需要注意!

封裝

參考一下鴻洋大神的一個對OKHttp的封裝:

原始碼分析

在簡書上看到一個系列的部落格,講的比較細緻清晰,分享一下,包括綜述、複用連線池、快取策略、DiskLruCache和任務佇列等5個部分:

有空再仔細研讀一下原始碼!!!!