OKHttp使用詳細およびソースコード解析
5455 ワード
前言
前のブログでは、OKHttpのパッケージであるRetrofitの使用について知りました.Retrofit 2の内部実装はOKHttp 3です.以下、OKHttp 3の使用について知ります.
使用
①まず依存をインポートします.最新バージョンは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());
}
});
}
ここで注意すべき点は、OKHttp 3で
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(){ });
ここで注意しなければならない問題の一つは、OKHttp 3でファイルアップロードに使用される
MultipartBody
が、以前のMultipartBuilder
に代わって、使い方も少し違いますので、注意してください.パッヶージ
鴻洋大神のOKHttpのパッケージを参考にしてください.
Android OkHttp完全解析はOkHttpを理解する時だhttp://blog.csdn.net/lmj623565791/article/details/47911083Androidの改善されたokHttpパッケージライブラリhttp://blog.csdn.net/lmj623565791/article/details/49734867
ソース分析
概要、多重接続プール、キャッシュポリシー、DiskLruCache、タスクキューの5つの部分を含む、一連のブログを簡単に見ました.