OKHttp使用詳解及原始碼解析
阿新 • • 發佈:2019-01-11
前言
上一篇部落格瞭解了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個部分:
有空再仔細研讀一下原始碼!!!!